MySQL上基于每周的ORDER BY

时间:2012-02-22 09:45:12

标签: mysql sql time sql-order-by subquery

我想从我的数据库中随机选择一个条目,但不是每次通话,而是根据一些其他外部因素作为一年中的一周,或一年中的某一天。我怎样才能做到这一点?

这将告诉我当前的一周:

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语句。无论如何,我已经解决了这个问题,请看这条评论:Weekly-based ORDER BY on MySQL

2 个答案:

答案 0 :(得分:2)

您看到错误的原因是LIMIT子句只能将文字作为参数,它不接受变量。

如果要选择不同的(随机)行数,可以创建一个接受所需行数的函数,并在循环中选择行到临时表。之后,您可以从该表中选择所有内容。

如果您想根据某些数据选择一个条目,那么您应该使用ORDER BY并选择N个第一行。

答案 1 :(得分:2)

根据documentation

  

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;