Mysql 选择1个随机行,然后选择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个记录。比如说,如果
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 is
bigint(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