mysql获取随机数据问题总结

1.order by rand()

数据多了极慢,随机性非常好,适合非常小数据量的情况。

 

 代码如下 复制代码
SELECT * FROM table_name AS r1 JOIN (SELECT (ROUND(RAND() * (SELECT ABS(MAX(id)-MIN(id)-$limit) FROM table_name))+(SELECT MIN(id) from table_name)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT $limit;

速度非常快,但是得到的数据是id连续的,没办法解决。

子查询产生一个随机数。

rand()是0到1的随机数,可以等于0到1。
MAX(id)-MIN(id)还要要减去$limit以免结果数量不够$limit条
因为主表id可能不连续,所以r1.id要>=r2.id

还要注意的是有时候最小id不是从1开始的,可能从一个很大的数开始,所以必须加上M(id)的值
手册相关内容:若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。

例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:

 代码如下 复制代码

SELECT FLOOR(7 + (RAND() * 6));
select * from test where rand()>0.0005 limit 10;

0.0005是一个计算出的比例直接关系到随机的质量,比如数据表10000条数据,需要随机取300条,那么0.0005就需要改成(300/10000=0.03)。
这种方法不能保证每次能取到多少,需要取多次。

2和3速度一样的快,主要区别是2总能返回limit条数据,3就没准了(符合正太分布)。2是连续数据,3是随机行。

时间: 2024-09-27 18:59:17

mysql获取随机数据问题总结的相关文章

MySQL查询随机数据的4种方法和性能对比

 从MySQL随机选取数据也是我们最常用的一种发发,其最简单的办法就是使用"ORDER BY RAND()",本文介绍了包括ORDER BY RAND()的4种获取随机数据的方法,并分析了各自的优缺点. 下面从以下四种方案分析各自的优缺点. 方案一:  代码如下:SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1; 这种方法的问题就是非常慢.原因是因为MySQL会创建一张零时表来保存所有的结果集,然后给每个结果一个随机索引,然后再排序并返回.

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(2

MySQL获取所有分类的前N条记录_Mysql

比如有文章表 Article(Id,Category,InsertDate),现在要用SQL找出每种类型中时间最新的前N个数据组成的集合,一段不错的代码,留存备用 SELECT A1.* FROM Article AS A1 INNER JOIN (SELECT A.Category,A.InsertDate FROM Article AS A LEFT JOIN Article AS B ON A.Category = B.Category AND A.InsertDate <= B.Inse

MySQL 从表中取出随机数据

实现随机,从手册中找到了下面这个语句,可以完成任务: 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); -&

从MySQL数据库表中取出随机数据的代码_php技巧

MySQL 如何从表中取出随机数据  以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩. 他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询. 翻了手册,找到了下面这个语句,可以完成任务了 SELECT * FROM table_name ORDER BY rand() LIMIT 5; rand在手册里是这么说的: RAND()  RAND(N)  返回在范围0到1.0内的随机浮点值.如果一个整数参数N被指定,它被用作种子值.  mysql> select RAND

mysql查询随机几条数据

MySql查询随机几条数据 想到了 Max RAND 这几个函数 用以下2种办法都可以实现查询. 速度还行. 几十万数据左右, 没有什么问题. SELECT * FROM `news` WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `news`))) LIMIT 10; SELECT * FROM `news` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `new

微信获取BAE上的mysql中的数据问题

问题描述 微信获取BAE上的mysql中的数据问题 <?php $dbname = 'ePjMlhlEtSYcyqaWDIMM'; /*从环境变量里取出数据库连接需要的参数*/ $host = getenv('HTTP_BAE_ENV_ADDR_SQL_IP'); $port = getenv('HTTP_BAE_ENV_ADDR_SQL_PORT'); $user = getenv('HTTP_BAE_ENV_AK'); $pwd = getenv('HTTP_BAE_ENV_SK'); /*

mysql insert语句后如何获取insert数据的主键值自动编号

关于mysql教程 insert语句后如何获取insert数据的主键值自动编号呢, 方法很简单的,mysql数据自带的了mysql_insert_id ( );函数 使用方法: insert into(a')values('b') $nid = mysql_insert_id ( ); 方法二: LAST_INSERT_ID(),不过关于这个函数,与mysql_insert_id()比较有很多的区别,mysql_insert_id ()是直接获取当前session的insert_id,而LAST

Uber是如何使用MySQL设计可扩展性数据存储的?

在Mezzanine项目中我们描述了我们是如何将Uber的核心行程数据从单个的Postgres节点迁移到Schemaless,这是我们开发的一个容错性很高.可用的数据存储. 根据Uber工程师的习惯使用MySQL设计的数据存储,使我们可以从2014 扩容到更高.本文分成三部分对Schemaless进行阐述. 一.Schemaless的总体设计   这一部分我们将讲述Schemaless的架构它在Uber基础结构中的角色以及他是如何成为该角色的. 1.我们对新数据库的迫切需求 2014年初,由于出