这两天觉得自己的基本功不够扎实,于是躲在家里看PHP,mysql手册。 发现这个句子在大部分情况下能实现随机读取mysql记录: 表的结构如下: | id | bigint(11) unsigned | NO | PRI | NULL | auto_increment | | tag | varchar(32) | NO | | | | | hash | varchar(32) | NO | | | | | created | bigint(11) | NO | | | | | article_id | bigint(11) | NO | | | | select * from tag order by RAND() desc limit 10G 秘决在于: 1.Rand函数. 2.不仅用order by id可以依id排序,用order by 1也可以依id排序.因此用rand函数来生成order by 子句。 犯错误了,order by 1 确实可以生效,但是rand函数不能用在order by 子句中。 而且,当表中有column(1),column(2)…..共10列时,用order by 1,order by 2,….分别是按column(1),column(2)…排序的,但是我用order by 11时,就报错了。再用SELECT * FROM table order by RAND()*1000,却不报错。 看下面的例子: select *,(rand()*1000) as a from x_feeds order by a; 每次输出,都不同。 再稍变一次: mysql>select *,(rand()*1000) as a from x_feeds order by 514; 每次都出错。 再变之: mysql>select *,(rand()*1000) as a from x_feeds order by 514.37134 将order by 后跟上小数(学计算机的不能这么说啊),就能正常输出,但是是按表的原来顺序输出的,每次结果都一样。 暂时未找到真正原因,mysql文档中文版如此说:

你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做: SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。