mysql随机查询数据

所以,结论是,我建议,能够不用ORDER BY RAND() 就不用!因为一来可以避免今后表数据量增大后引起的效率低下;二来可以避免某些版本的MYSQL不支持这种写法。

最后给出一种比较实用的替代方法的主要思想:

假设id是主键

首先:SELECT MIN(id), MAX(id) FROM tablename

然后:$id=rand($min,$max); //通过rand返回刚才取到的最大id和最小id之间的一个id号。

最后:SELECT * FROM tablename WHERE id='$id' LIMIT 1

如果是用auto increment产生的id号,也许会出现某个id列曾经删除过,造成了最大和最小id之间的不连续,在这里可以先判断一下随机生成的这个id号是否存在。 
我现在就使用order by rand(),当然数据表还很小很小。

你这种方法也不错,但是如果我要随机的10条呢? 
最简单的就是随便取个连续的范围,比如

SELECT * FROM tablename WHERE id > '$id' LIMIT 10

但这种方法的随机是连续的.

然后还有比如生成一个WHERE  id = '{$id['1']}' OR id = '{$id['2']}' OR .....的从句,写起来会稍微多几句,$id的值随机生成数。

但这种方法如果从句多了话,比如上百条?那样SQL语句会比较大,也会影响效率。

还有,先按照第一种随机选择一个范围,比如

SELECT id FROM tablename WHERE id > '$id' LIMIT 50

然后再在在结果中随机选择10个

还有,每次随机取一个,取10次。
 
随机查询十条记录
$a  = D('article');
$id = mt_rand($a->min('id'),$a->max('id'));
dump($a->where('id > ' . $id)->limit(10)->select());


 
首先:SELECT MIN(id), MAX(id) FROM tablename

然后:$id=rand($min,$max); //通过rand返回刚才取到的最大id和最小id之间的一个id号。

最后:SELECT * FROM tablename WHERE id='$id' LIMIT 1

如果记录的ID是唯一的,且记录有过删除,那很可能取到的这个ID就没有记录存在。

所以如果用这个办法,一定要再select一下,看看这个记录是否存在了