Mysql 随机读取记录的一种实现
10月 7, 2007 on 12:28 pm | In 未分类 |这两天觉得自己的基本功不够扎实,于是躲在家里看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 10\G
秘决在于:
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被执行时重新评估。
No Comments yet »
发表评论
Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds.
Valid XHTML and CSS. ^Top^