Mysql 选择1个随机行,然后选择n个行
在选择一个随机的行之后,我希望能够在它之后选择n个记录。比如说,如果Mysql 选择1个随机行,然后选择n个行,mysql,sql,Mysql,Sql,在选择一个随机的行之后,我希望能够在它之后选择n个记录。比如说,如果n=10,我有一个表numbers\u table,其中有一列numbers具有连续的行1到10000,如果我随机选择65,我想返回行65到75。此查询返回10个随机行: SELECT `number` FROM `numbers_table` ORDER BY RAND() LIMIT 10 下面的方法也不管用。它返回65,然后返回其后的任何其他连续序列(如6590919293…) 我想你想这么做 SELECT numbe
n=10
,我有一个表numbers\u table
,其中有一列numbers
具有连续的行1到10000,如果我随机选择65,我想返回行65到75。此查询返回10个随机行:
SELECT `number` FROM `numbers_table` ORDER BY RAND() LIMIT 10
下面的方法也不管用。它返回65,然后返回其后的任何其他连续序列(如65
90
91
92
93
…)
我想你想这么做
SELECT number
FROM numbers_table,
(SELECT FLOOR(RAND()*MAX(number)) num FROM numbers_table) b
WHERE number > b.num
ORDER BY number LIMIT 10;
将Rand()放在where子句中的问题是,每次对每一行计算它时都会得到类似这样的结果:
select number
from numbers_table
where number > (
select number
from numbers_table
where number < (
select min(number) too_high_id from (
select number from numbers_table order by number desc limit 10
) highest_10
)
order by rand()
limit 1
)
order by number
limit 11
如果您的数字中有空白,并且只希望数字在随机选择的数字的10以内,则最好这样做:
select numbers_table.number
from (
select number as pick
from numbers_table
order by rand()
limit 1
) pick
join numbers_table on number between pick and pick+10
返回空的结果集:/@CedricIpkiss表中的max num是多少;替换10000我认为它生成的是0到10000之间的随机数,数字范围可能不在您的表中Column type isbigint(20)
使用显式连接子句,而不是长时间皱眉的逗号连接地板使用过量。。。把Rand()放在where子句中的问题是每次我怀疑的每一行都会计算它。。。子查询不相关,服务器足够聪明,可以执行它一次并重用它的输出。如果ID为66到75的行少于10行怎么办?您想要10行还是只想要id在随机行10以内的行?可以选择靠近id末尾的随机行,这样id后面就没有10行了吗?还是需要防止这种情况发生?@ysth在这种情况下,只返回选定行后面的行。如果选定的行是最后一行,则只返回它您没有回答我上面评论的第一部分-虽然问题是“连续的”,所以理论上不应该发生。如果查询真的发生了,知道它应该如何工作仍然很好。它返回65,然后返回其后的任何其他连续序列(如65 90 91 92 93…),问题源在外部查询中缺少ORDERBY子句。其中提供“大于”但不提供“紧接之后”。请帮助我更好地理解,min\u id
行表示什么?你是说min(id)?那里的版本缺少order by rand()limit 1;查看当前版本(也将id更改为数字;不确定我为什么使用id)此行为类似于我回答中的第二个代码(返回65
90
91
92
93
..)@CedricIpkiss我没有看到您的第二个查询;您缺少按编号排序的
select number
from numbers_table
where number > (
select number
from numbers_table
order by rand()
limit 1
)
order by number
limit 11
select numbers_table.number
from (
select number as pick
from numbers_table
order by rand()
limit 1
) pick
join numbers_table on number between pick and pick+10