MySQL取出随机数据

 更新时间:2008年04月06日 01:25:16   投稿:mdxy-dxy  
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.*以上才支持这样的子查询. 

下面是其它网友的补充:

select id from  zhyx_items   order by rand()  这样效率太低了

优化sql语句之后:

SELECT t1.id 
FROM zhyx_items AS t1 JOIN 
(SELECT ROUND(RAND() *
((SELECT MAX(id) FROM zhyx_items)-(SELECT MIN(id) FROM zhyx_items))+
(SELECT MIN(id) FROM zhyx_items)) AS id) AS t2 
WHERE t1.id >= t2.id 
ORDER BY t1.id LIMIT 0,5;

相关文章

  • MySQL数据库改名的三种实现方式

    MySQL数据库改名的三种实现方式

    这篇文章主要介绍了MySQL数据库改名的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • MySQL索引失效的14种场景分享

    MySQL索引失效的14种场景分享

    作为一名后端程序员,经常会对慢查询SQL语句进行调优,而SQL语句出现慢查询,很多情况是由于索引失效造成的,本文为大家整理了14种MySQL索引失效的场景,需要的可以参考一下
    2023-05-05
  • SQL实现LeetCode(181.员工挣得比经理多)

    SQL实现LeetCode(181.员工挣得比经理多)

    这篇文章主要介绍了SQL实现LeetCode(181.员工挣得比经理多),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 如何获取SqlServer2005表结构(字段,主键,外键,递增,描述)

    如何获取SqlServer2005表结构(字段,主键,外键,递增,描述)

    本篇文章是对如何获取SqlServer2005表结构(字段,主键,外键,递增,描述)的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL中大对象的多版本并发控制详解

    MySQL中大对象的多版本并发控制详解

    这篇文章主要给大家介绍了关于MySQL中大对象的多版本并发控制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 论一条select语句在MySQL是怎样执行的

    论一条select语句在MySQL是怎样执行的

    本文将建立一套建立一套MySQL的知识框架,通过讨论select语句在MySQL是怎样执行的来展开内容,感兴趣的小伙伴一起来看下文吧
    2021-08-08
  • MySQL性能压力基准测试工具sysbench的使用简介

    MySQL性能压力基准测试工具sysbench的使用简介

    这篇文章主要介绍了MySQL性能压力基准测试工具sysbench的使用简介,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-04-04
  • MySQL数据库必备之条件查询语句

    MySQL数据库必备之条件查询语句

    当用户查看表格的大量数据是,由于数据量过于巨大会导致很难获取到需要的数据,在这时,就需要一个方法,一个可以通过用户输入获取到用户需要的数据并回填入表格,这就是条件查询的作用
    2021-10-10
  • Ubuntu16.04 server下配置MySQL,并开启远程连接的方法

    Ubuntu16.04 server下配置MySQL,并开启远程连接的方法

    这篇文章主要介绍了Ubuntu16.04 server下配置MySQL,并开启远程连接的方法,非常具有实用价值,需要的朋友可以参考下。
    2017-01-01
  • 深入分析Mysql中limit的用法

    深入分析Mysql中limit的用法

    很久没用mysql的limit,一时大意竟然用错了,自认为(limit 开始,结束),其实错了,正确的应该是(limit 偏移量,条数),为了记住这次错误,转载一篇limit用法详解。推荐给大家,希望对大家能够有所帮助。
    2015-03-03

最新评论