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 查询优化与 group by 和 order by rand
mysql order by rand() 性能问题及解决方案