Еженедельный ORDER BY на MySQL - PullRequest
4 голосов
/ 22 февраля 2012

Я хочу выбрать запись из своей базы данных случайным образом, но не при каждом вызове, а в зависимости от какого-либо другого внешнего фактора, например, недели года или дня года.Как я могу достичь этого?

Это скажет мне текущую неделю:

SELECT DATE_FORMAT(CURDATE(),'%u');

Итак, чтобы получить запись, основанную на этом значении, я выбираю номер записи:

SELECT (DATE_FORMAT(CURDATE(),'%u')+0) MOD (SELECT COUNT(*) 
FROM my_view 
ORDER BY id);

Итак, моя попытка:

SELECT * FROM my_view
LIMIT (SELECT (SELECT DATE_FORMAT(CURDATE(),'%u')+0) MOD (SELECT COUNT(*) 
  FROM my_view
  ORDER BY id))
,1;

И все, что я получаю, это:

ERROR 1064 (42000): You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near '(SELECT (SELECT DATE_FORMAT(
CURDATE(),'%u')+0) MOD (SELECT COUNT(*) FROM ' at line 1

Может быть, это не лучший подход?Это не возможно?Спасибо.

ОБНОВЛЕНИЕ: Я хочу вставить это в VIEW, поэтому я могу использовать только операторы SELECT.В любом случае, я уже решил это, пожалуйста, смотрите этот комментарий: Еженедельный ORDER BY на MySQL

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Согласно документации :

LIMIT принимает один или два числовых аргумента, которые оба должны быть неотрицательными целочисленными константами, за исключением:

  • Внутри подготовленных операторов LIMIT параметры могут быть указаны с помощью ? меток-заполнителей.

  • В хранимых программах параметры LIMIT могут быть заданы с помощью целочисленных стандартных параметров или локальных переменных.

Таким образом, возможное решение может быть примерно таким:

SET @offset = WEEKOFYEAR(CURDATE()) MOD (SELECT COUNT(*) FROM my_view);
PREPARE STMT FROM 'SELECT * FROM my_view LIMIT ?, 1';
EXECUTE STMT USING @offset;
2 голосов
/ 22 февраля 2012

Причина ошибки, которую вы видите, состоит в том, что предложение LIMIT может принимать только литералы в качестве аргументов, оно не принимает переменные.

Если вы хотите выбрать другое (случайное) количество строк, вы можете создать функцию, которая принимает желаемое количество строк, и в цикле выбрать строки во временной таблице. После этого вы можете просто выбрать все из этой таблицы.

Если вы хотите выбрать запись, основанную на некоторых данных, вам следует поиграть с ORDER BY и выбрать N первых строк.

...