MySQL中的随机行教程
我正在尝试在MySQL中获得随机行.这是我的方法:
SELECT *
FROM users
WHERE id =
(SELECT floor((max(id) - min(id) + 1) * rand()) + min(id)
FROM users);
如果ID中有空格,则可以返回一个空集.我很好.然而,
我没有差距,但我仍然很经常出现空白.
更令人不安的是:我偶尔会得到两个或多个结果.
这种奇怪行为的原因是什么?我该怎么办?
注意:
桌子很大(10 ^ 6 … 10 ^ 7);我不能使用任何基于随机排序甚至基于count()的显而易见的已知解决方案.
我坚持使用MySQL,我不在乎它是如何在客户端ruby / PHP /任何地方完成的.
我尝试转换浮点类型,但没有帮助.
相应的PostgreSQL变体(随机代替rand,以及某些类型强制转换)可以正常工作.
解决方法:
这样可以避免在聚合过程中对random()进行重复评估,并且也应该更快,因为min(id)和random()仅被评估一次.
SELECT u.*
FROM users u
,(SELECT min(id) AS min_id, max(id) AS max_id FROM users) x
WHERE u.id > (floor((x.max_id - x.min_id + 1) * rand()) + x.min_id)
LIMIT 1;