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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。