一、随机查询一条数据
方法一:SELECT * FROM `table` ORDER BY RAND() limit 1
评价:不建议使用,效率非常低,官方文档中进行说明:Order By和RAND()连用,会多次扫描表,导致速度变慢。
方法二:SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 1;
解释:SELECT MAX(id) FROM `table` 这句话查询出最大的id值
SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)) 这句获取一个小于MAX(id)的随机数
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) 这句话筛选出所有的大于生成随机数的id的行
然后最后就把大于这个随机id的行查询出来,然后按照id排序,选择第一个,就相当与获取了所有行中随机的一行。
评价:有问题,如果id不是从0开始的话,比如从10000开始自增,那么 SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)) 得到的将是会哟很大概率得到小于10000的值,经过where限定的查询结果将会是所有的查询结果的几率变大,最后limit 1获取的是第一行数据的几率变高。
方法三:SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`))) ORDER BY id LIMIT 1;
方法四:SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+
(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
评价:解决了方法二中MAX(id)的问题,RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`)可以获取MAX(id)和MIN(id)中的随机数。
方法四要比方法三稍快一点,//www.gxlcms.com/article/42229.htm 这篇文章指出,15w条数据前者花费时间 0.147433 秒,后者花费时间 0.015130 秒。
以上解决方案都默认有一个不重复的数字字段,其实现在很多表的设计都是以一个自增段作为主键,当然还有一些是以uuid作为主键的,而没有数字键,这样的话,可以用mysql的函数将uuid的字符串转换成数字。而且还有一个问题,如果id字段的数字分布不均匀的话(比如按照1,4,5,6,7,8,45这样分布),也会造成随机查询的不合理,但是这里就不讨论那么复杂的问题了。
二、随机查询多条数据
方法一:把随机查询一条数据的limit 1修改成limit 5
评价:这样获取的数据会是连续的。
方法二:
SELECT *
FROM `table` AS t1 JOIN (
SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id
from `table` limit 50) AS t2 on t1.id=t2.id
ORDER BY t1.id LIMIT 1;
解释:
SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id
from `table` limit 50)这样会获取50个随机数字,然后on t1.id=t2.id会挑选出不大于50行的随机数据,然后取5条就好了。
纷纭教育还为您提供以下相关内容希望对您有帮助:
mysql查询随机几条数据
答案:可以使用MySQL中的`RAND`函数来查询随机数据。具体查询方法取决于你想查询的数据表及需求,以下是一个基本示例:假设你有一个名为`your_table`的数据表,并且想要随机选择其中的5条数据,可以使用如下SQL语句:sql SELECT * FROM your_table ORDER BY RAND LIMIT 5;这条SQL语句会返回表中的随机
怎么从mysql中随机取出10条数据
答案:从MySQL中随机取出10条数据,可以使用`ORDER BY RAND`函数并结合`LIMIT`子句来实现。具体的SQL查询语句如下:sql SELECT * FROM 表名 ORDER BY RAND LIMIT 10;详细解释:1. 使用`ORDER BY RAND`函数:- `RAND`函数在MySQL中产生一个随机数。当与`ORDER BY`结合使用时,它会根据这个随机数...
怎么从mysql中随机取出10条数据
使用SQL的RAND()函数,你可以执行这样的查询:SELECT * FROM your_table ORDER BY RAND() LIMIT 10;这里的"your_table"需要替换为你要查询的具体表名。这个查询首先会对表中的所有行进行随机排序,然后只返回前10行,从而达到随机抽取10条数据的效果。如果你想通过生成随机数的方式来实现,首先生成10...
MySQL如何通过内置函数生成随机数
MySQL提供了内置函数RAND()来生成随机数,以下是具体使用方法:基本用法:直接调用RAND()函数会生成一个0到1之间的随机浮点数。例如,执行SELECT RAND();可能返回类似0.1234567的结果。指定范围随机数:若需生成特定范围内的随机数,可结合数算实现。比如,生成1到100的随机整数,可用公式FLOOR(1 +...
怎么从mysql表中随机取数据
下面是一个小实例:从文章表中随机获取5条数据。dblink=mysql_connect("localhost","root","123456");mysql_query("set names utf8");mysql_select_db("aixuexi");sql="select * from waxx_article order by rand() limit 0,5";rs=mysql_query($sql);while($row=mysql_fetch_array($rs))...
根据某一字段 随机查询
3.根据2中的查询结果,随机取某个point_type下数据的某一条, select T.point_type,T.ceiling(RAND()*pn) from (select point_type,count(point_type) as pn from 表名 group by point_type) as T 4.集合3和一中的进行左联,查询出point_type相同,并且第item项序号=随机取的数的 select ...
有一个mysql的数据表,我要随机抽取10条记录,用什么方法最好。_百度知...
1.通过MYSQL内置的函数来操作,具体SQL代码如下:SELECT * FROM tablename ORDER BY RAND() LIMIT 10 2.不要将大量的工作给数据库去做,这样会导致数据库在某一集中并发时间内锁死并阻塞。建议通过PHP随机生成一下1-X(总行数)之间的数字,然后将这10个随机数字作为查询条件,具体语句如:SELECT *...
MySQL随机查询优化问题,怎么解决
系统首先根据各个表之间的联接条件,把多个表合成一个临时表 后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里 (12) 减少对表的查询: 在含有子查询的SQL语句中,要特别注意减少对表的查询.例子: ...
怎么从mysql中随机取出10条数据
试试下面的代码:MySQL select 10 random rows from 600K rows fastORDER BY RAND()或者生成10个随机数,然后用随机数查询。
mysql数据库 如果数据库中有800万条数据,我想随机抽取10000条,要怎么...
针对你这个,800万条数据如果在一个表里,要有个整数型的ID作为主键,并做索引。如果数据是从不同的表里抽出来再组合起来的,表与表之间的链接键尽量用整数型并做索引。然后生成10000个随机数,在ID里查找这1万个数字,取出对应的数据。处理过程放到数据库端。针对你这个,10000个随机数的生成函数用...