从MySQL表中随机选择最后三个条目之一

时间:2011-12-02 11:57:52

标签: mysql

我想显示最新的三个新闻项目之一。我提出了以下问题:

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)

4 个答案:

答案 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()