mysql获取随机数据的问题,很纳闷

2010年6月21日 | 分类: 数据库技术 | 标签: ,

记得以前找到过方法,而且可用,忘记了,重新google,发现网上提供的方法,有些问题:

一个简单的实现如下:

SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
ORDER BY id LIMIT 1;
简化测试可以写为:select * from `table` where id>=(select rand()*(select max(id) from `table`)) limit 10

据我测试mysql5.1  如果table有20000条数据,基本没有可能获取到一条大于1000的数据,我也搞不清楚原因,难道是我的mysql版本问题?真是奇怪了。继续测试。
将limit 1 改为10后,结果发现,返回的数据依然不能超过1000,而且结果的id不连续,则说明mysql是逐条执行了where的rand,即执行了20000次,这是我的估计,毕竟我不是mysql专家,不知道如何研究。即便是这样,那么每条的几率依然应该是1/20000分之一的,为何结果却出乎意料?
换了一个mysql服务器,5.1.41,结果依然如此。

找到原来的写法了,很简单:order by rand() limit 10,,如果数据大可以用id in (select rand()*max(id) from t,..,..) ,呵呵,这是从别人那看到的。另外附加sql server的写法:select top 10 * from tablename order by newid()

anyShare分享到:
          
  1. 2011年10月25日11:43

    兄弟,你真强大,竟然敢用order by rand() limit 10,太佩服了
    SELECT t1.*
    FROM `${table}` AS t1 JOIN (
    SELECT @maxid:=(FLOOR(RAND() * (SELECT MAX(id) FROM `${table}`))),@lid:=(select id from ${table} where ${where} order by id desc limit ${$show}-1,1),(if(@maxid>@lid,@lid,@maxid)+0) as id
    ) as t2
    WHERE t1.id >= t2.id and ${where}
    ORDER BY t1.id LIMIT ${$show};
    用这个吧,超强版,