Mysql 随机读取记录的一种实现

10月 7, 2007 on 12:28 pm | In 未分类 |

这两天觉得自己的基本功不够扎实,于是躲在家里看PHP,mysql手册。
发现这个句子在大部分情况下能实现随机读取mysql记录:
表的结构如下:

  1. | id             | bigint(11) unsigned | NO   | PRI | NULL    | auto_increment |
  2. | tag            | varchar(32)         | NO   |     |         |                |
  3. | hash           | varchar(32)         | NO   |     |         |                |
  4. | created        | bigint(11)          | NO   |     |         |                |
  5. | article_id     | bigint(11)          | NO   |     |         |                |
  1. 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,却不报错。

看下面的例子:

  1. select *,(rand()*1000) as a from x_feeds order by a;

每次输出,都不同。
再稍变一次:

  1. mysql>select *,(rand()*1000) as a from x_feeds order by 514;

每次都出错。
再变之:

  1. 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 »

评论 RSS Feed。 TrackBack URI

发表评论

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds. Valid XHTML and CSS. ^Top^