MySQL ORDER BY rand(),名称为 ASC

Posted

技术标签:

【中文标题】MySQL ORDER BY rand(),名称为 ASC【英文标题】:MySQL ORDER BY rand(), name ASC 【发布时间】:2011-02-22 09:11:48 【问题描述】:

我想获取一个包含 1000 个用户的数据库并选择 20 个随机用户 (ORDER BY rand(),LIMIT 20),然后按名称对结果集进行排序。我想出了以下查询,它没有像我希望的那样工作。

SELECT * FROM users WHERE 1 ORDER BY rand(), name ASC LIMIT 20

【问题讨论】:

究竟是什么不适合你? 当我在这里的 1600 个用户的数据库上尝试按 rand() 限制 3 排序时,我始终得到随机结果。 @vfilby:是的,现在试试order by rand(), name asc,你会发现它不是按名称排序的。 【参考方案1】:

使用子查询:

SELECT * FROM 
(
    SELECT * FROM users ORDER BY rand() LIMIT 20
) T1
ORDER BY name 

内部查询随机选择 20 个用户,外部查询按名称对选定的用户进行排序。

【讨论】:

太棒了,有两件事。为什么在查询后T1,它的目的是什么?第二:你知道datamapper中是否可以使用子查询吗? 啊,所以您将内部选择转换为新的临时表。明白了。 @Josh K:关于你的第一个问题,它被称为别名。如果你省略它,你会得到这个错误:Every derived table must have its own alias.【参考方案2】:

由于性能和结果,请注意 ORDER BY RAND()。查看这篇文章:http://jan.kneschke.de/projects/mysql/order-by-rand/

【讨论】:

同意,这可能是性能最差的查询。 额外的 WHERE 约束将 RAND 负载放置在最多 500 行上。这不是一个巨大的表,性能不是问题。【参考方案3】:

您可以使用两个单独的查询,而不是使用子查询,一个用于获取行数,另一个用于选择随机行。

SELECT COUNT(id) FROM users; #id is the primary key

然后,随机获取二十行。

$start_row = mt_rand(0, $total_rows - 20);

最终查询:

SELECT * FROM users ORDER BY name ASC LIMIT $start_row, 20;

【讨论】:

我相信这应该是正确的答案,只是因为我认为资源可能低于调用 RAND() 或使用“子查询”。 你总是会得到 20 个连续的用户(他们的名字是“连续的”),而不是随机的 20 个。【参考方案4】:
SELECT  *
FROM    (
        SELECT  *
        FROM    users
        WHERE   1
        ORDER BY
                rand()
        LIMIT 20
        ) q
ORDER BY
        name

【讨论】:

【参考方案5】:

使用子查询:

SELECT * FROM (
    SELECT * FROM users ORDER BY RAND() LIMIT 20
) u
ORDER BY name

或加入自身:

SELECT * FROM users u1
INNER JOIN (
    SELECT id FROM users ORDER BY RAND() LIMIT 20
) u2 USING(id)
ORDER BY u1.name

【讨论】:

以上是关于MySQL ORDER BY rand(),名称为 ASC的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:ORDER BY RAND() 的替代方案

MySQL 查询优化与 group by 和 order by rand

mysql order by rand() 性能问题及解决方案

改进MySQL Order By Rand()的低效率

ORDER BY RAND()函数在mysql中执行需要很长时间[重复]

PHP,MySQL - 结果数组洗牌会比“select ... order by rand()”更快吗?