微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;

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

相关推荐