我想显示最新的三个新闻项目之一。我提出了以下问题:
SELECT
*
FROM
News
WHERE
Id IN (
SELECT
Id
FROM
News
WHERE
Display=1
ORDER BY
Published DESC
LIMIT 3
)
ORDER BY
RAND()
LIMIT 1
我预计这会非常低效,但会起作用。事实上,它没有:
查询错误(1235):此版本的MySQL尚不支持'LIMIT& IN / ALL / ANY / SOME子查询'
所以我的实际问题是,有没有办法从表中随机选择最后三项之一?
mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+-------------------------+
| Variable_name | Value |
+-------------------------+-------------------------+
| innodb_version | 5.6.28 |
| protocol_version | 10 |
| slave_type_conversions | |
| version | 5.6.28-0ubuntu0.15.10.1 |
| version_comment | (Ubuntu) |
| version_compile_machine | x86_64 |
| version_compile_os | debian-linux-gnu |
+-------------------------+-------------------------+
7 rows in set (0.00 sec)
答案 0 :(得分:2)
尽量避免使用ORDER BY RAND()
。这里更好的方法是从数据库中获取最新的三个条目。然后在服务器端代码中随机选择一个。
答案 1 :(得分:1)
如果你提到here
,我发现了一个类似的问题您必须创建一个临时表,然后从中随机选择一行。在你的情况下,它将是:
SELECT * FROM (
SELECT * FROM `News` WHERE `Display` = `1`
ORDER BY `Published` DESC LIMIT 3
) AS temptable
ORDER BY RAND()
LIMIT 1
如前所述,选择最后10个并在服务器端代码中随机选择一个可能是个好主意。
答案 2 :(得分:0)
错误表示MySQL不支持以下格式的语句:
SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)
请参阅mysql文档here
答案 3 :(得分:-1)
当您遇到过于复杂的事情时,编程也在寻找解决方法。 :)
就像你想用外语说些什么而你想念一个词,所以你说不然。
在这里,您可以获得最后3条新闻,放入表格并选择随机新闻。
如果您使用PHP编写代码,请查看array_rand()
。