我想从我的数据库中随机选择一个条目,但不是每次通话,而是根据一些其他外部因素作为一年中的一周,或一年中的某一天。我怎样才能做到这一点?
这将告诉我当前的一周:
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
答案 0 :(得分:2)
您看到错误的原因是LIMIT
子句只能将文字作为参数,它不接受变量。
如果要选择不同的(随机)行数,可以创建一个接受所需行数的函数,并在循环中选择行到临时表。之后,您可以从该表中选择所有内容。
如果您想根据某些数据选择一个条目,那么您应该使用ORDER BY
并选择N个第一行。
答案 1 :(得分:2)
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;