MySQL 如何从表中取出随机数据

2016-01-29 15:10 8 1 收藏

MySQL 如何从表中取出随机数据,MySQL 如何从表中取出随机数据

【 tulaoshi.com - MySQL 】

以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了
SELECT * FROM table_name ORDER BY rand() LIMIT 5;
rand在手册里是这么说的:
RAND() 
RAND(N) 
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。 
mysql select RAND();
        - 0.5925
mysql select RAND(20);
        - 0.1811
mysql select RAND(20);
        - 0.1811
mysql select RAND();
        - 0.2079
mysql select RAND();
        - 0.7888
你不能在一个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被执行时重新评估。 
但我试了一下,8千条记录的表,执行一次需要0.08 sec,.慢了些
后来请教了google,得到如下代码
SELECT *
  FROM table_name AS r1 JOIN 
       (SELECT ROUND(RAND() * 
                     (SELECT MAX(id) 
                        FROM table_name)) AS id)
        AS r2 
 WHERE r1.id = r2.id 
 ORDER BY r1.id ASC 
 LIMIT 5;
执行效率需要0.02 sec.可惜的是,只有mysql 4.1.*以上才支持这样的子查询.

来源:https://www.tulaoshi.com/n/20160129/1495406.html

延伸阅读
利用oracle的dbms_random包结合rownum来实现,示例如下,随机取499户: select * from ( select * from busi.t_ar_userinfo order by dbms_random.value) where rownum 500; 有关dbms_random的参考文献,链接为:http://www.psoug.org/reference/dbms_random.html Deprecated. Use the methods in the DBMS_CRYPTO built-in package,...
标签: ASP
  各位好今天我要告诉大家的是如何用ASP产生随机数。大家都知道大多数网站注册后 提供用户名和一个随机密码,但这个密码是如何产生的,现在我就向大家来介绍一下 请看下面的例子,用户可自行增加或减少随机的字符或数量。 <% Function gen_key(digits) 'Create and define array dim char_array(50) char_array(0) = "0"...
标签: MySQL mysql数据库
  如果数据表有问题,可以利用--recover --quick参数做修补的工作: linux#myisamchk --recover --quick tbl_name linux#isamchk --recover --quick tbl_name 如果上面的方法不能解决问题,可以将--quick参数去掉: linux#myisamchk --recover tbl_name linux#isamchk --recover tbl_name 如果还是不能解决问题,可以再试着改用--sa...
标签: MySQL mysql数据库
  在进行数据表检查或修补时,可以先将数据表锁定,可确保数据表的安全: mysqlLOCK TABLE tbl_name READ; mysqlFLUSH TABLES; 将数据表锁定后再进行检查或修补的工作。完成后再解除锁定: mysqlUNLOCK TABLES; //LOCK TABLE tbl_name READ表示要锁定成只读状态,在这个状态下用户只能读取数据表,不能写入。 LOCK TABLE tbl_name W...
/*1.从同一个种子开始*/ #include stdio.h #include conio.h static unsigned long int next=1;int rand0(void) { next=next*1103515245+12345; return (unsigned int)(next/65536)%32768; }int main(void) { int count;for(count=0;count5;count++)    printf("%hd",rand0()); getch();...

经验教程

76

收藏

38
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部