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中时间日期类型和字符串类型的选择,感兴趣的朋友赶快来看一看吧,希望对你有帮助
    2021-11-11
  • Mysql日期格式以及内置日期函数用法详解

    Mysql日期格式以及内置日期函数用法详解

    MySQL中有多种数据类型可以用于日期和时间的表示,这篇文章主要给大家介绍了关于Mysql日期格式以及内置日期函数用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 新手入门Mysql--sql执行过程

    新手入门Mysql--sql执行过程

    MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展MySQL是开放源代码的,因此任何人都可以在 GPL的许可下下载并根据个性化的需要对其进行修改
    2021-06-06
  • mysql left join快速转inner join的过程

    mysql left join快速转inner join的过程

    inner join内连接,显示两个表中有联系的所有数据而left join,左链接,以左表为参照,显示所有数据,右表中没有则以null显示,本文重点给大家讲解mysql left join快速转inner join的过程,需要的朋友参考下吧
    2021-06-06
  • MySQL触发器实现两表数据同步的代码详解

    MySQL触发器实现两表数据同步的代码详解

    在数据库应用中,我们经常需要对数据进行某些操作,并在操作完成后进行相应的处理,这时候,可以使用触发器来实现这些功能,MySQL提供了强大的触发器功能,本文将给大家详细介绍MySQL触发器实现两表数据同步,需要的朋友可以参考下
    2023-12-12
  • 浅析MySQL的基数统计

    浅析MySQL的基数统计

    这篇文章主要介绍了MySQL的基数统计的相关资料,帮助大家更好的理解和学习MySQL数据库的使用,感兴趣的朋友可以了解下
    2020-11-11
  • mysql日常使用中常见报错大全

    mysql日常使用中常见报错大全

    MySQL初学者新安装好数据库及使用过程中经常遇到以下几类错误,本文给大家详细整理并给出完美解决方案,感兴趣的朋友跟随小编一起看看吧
    2023-03-03
  • 数据库Mysql性能优化详解

    数据库Mysql性能优化详解

    这篇文章主要介绍了数据库Mysql性能优化的相关资料,需要的朋友可以参考下
    2016-05-05
  • mysql 索引的基础操作汇总(四)

    mysql 索引的基础操作汇总(四)

    这篇文章主要为大家详细介绍了mysql 索引的基础操作汇总,涵盖了创建和查看索引、删除索引等操作,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • MYSQL如何查看操作日志详解

    MYSQL如何查看操作日志详解

    任何一种数据库中都有各种各样的日志,下面这篇文章主要给大家介绍了关于MYSQL如何查看操作日志的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05

最新评论