如何 ORDER BY RAND() 并随机设置 LIMIT?
How to ORDER BY RAND() and set LIMIT randomly?
我想提取随机行,我希望每次我 运行
时行数都不同
我怎样才能做到这一点?
这是我的table
CREATE TABLE sbb_data (
scope_node VARCHAR(25),
site VARCHAR(20),
name VARCHAR(40),
is_deleted INT,
is_connected INT
);
SELECT name FROM sbb_data;
输出
SBB 1
SBB 2
SBB 3
SBB 4
SBB 5
SBB 6
SBB 7
SBB 8
SBB 9
SBB 10
SBB 11
当我运行下面的查询
SELECT name FROM sbb_data ORDER BY RAND() LIMIT 0,5;
我得到了这样的东西
SBB 8
SBB 9
SBB 2
SBB 10
SBB 4
但是输出的行数总是5
我希望它在 0,5
之间变化
您可以这样做的一种方法是插入更多的随机性:
SELECT name
FROM sbb_data CROSS JOIN
(SELECT COUNT(*) as cnt FROM sbb_data) x
WHERE RAND() < 5.0 / cnt
LIMIT 5;
这 select 每行都有一个概率,其中“5”是预期的数字——但是它可能大于或小于 5。limit 5
将其限制为 5。
正如所写,这会比其他数字多 select 5 行。您可能需要 4.0 / cnt
或 3.0 / cnt
以获得更均匀的分布。
此外,即使是中等大小的数据,这也比 order by rand()
快得多。
SELECT name FROM
( SELECT name,RAND() as rand FROM sbb_data order by RAND() ) as tab
where tab.rand <0.5 LIMIT 5
在查询中插入一个随机值,根据这个值行数会改变tab.rand <0.5
LIMIT 5
会将最大行数限制为 5 。
并将条件更改为 tab.rand <0.2
将使行数 <5 的可能性更大
SET @nrRows = floor(rand()*6);
PREPARE STMT FROM 'SELECT * FROM sbb_data ORDER BY RAND() LIMIT ?';
EXECUTE STMT USING @nrRows;
基本上你要问的是基于变量 (@nrRows
) 的限制,它应该取 [0, 5].
之间的值
随机选择5行,然后给它们分配一个新的随机数;选择新随机数小于 0.5 的行(平均选择一半的数字,但可能 none,可能全部)。
SELECT *
FROM (SELECT * FROM sbb_data ORDER BY RAND() LIMIT 0,5) rand5
WHERE RAND() < 0.5
例如:https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=c80a90b08e77e5e6448991d589f39df4
我想提取随机行,我希望每次我 运行
时行数都不同
我怎样才能做到这一点?
这是我的table
CREATE TABLE sbb_data (
scope_node VARCHAR(25),
site VARCHAR(20),
name VARCHAR(40),
is_deleted INT,
is_connected INT
);
SELECT name FROM sbb_data;
输出
SBB 1
SBB 2
SBB 3
SBB 4
SBB 5
SBB 6
SBB 7
SBB 8
SBB 9
SBB 10
SBB 11
当我运行下面的查询
SELECT name FROM sbb_data ORDER BY RAND() LIMIT 0,5;
我得到了这样的东西
SBB 8
SBB 9
SBB 2
SBB 10
SBB 4
但是输出的行数总是5
我希望它在 0,5
之间变化您可以这样做的一种方法是插入更多的随机性:
SELECT name
FROM sbb_data CROSS JOIN
(SELECT COUNT(*) as cnt FROM sbb_data) x
WHERE RAND() < 5.0 / cnt
LIMIT 5;
这 select 每行都有一个概率,其中“5”是预期的数字——但是它可能大于或小于 5。limit 5
将其限制为 5。
正如所写,这会比其他数字多 select 5 行。您可能需要 4.0 / cnt
或 3.0 / cnt
以获得更均匀的分布。
此外,即使是中等大小的数据,这也比 order by rand()
快得多。
SELECT name FROM
( SELECT name,RAND() as rand FROM sbb_data order by RAND() ) as tab
where tab.rand <0.5 LIMIT 5
在查询中插入一个随机值,根据这个值行数会改变tab.rand <0.5
LIMIT 5
会将最大行数限制为 5 。
并将条件更改为 tab.rand <0.2
将使行数 <5 的可能性更大
SET @nrRows = floor(rand()*6);
PREPARE STMT FROM 'SELECT * FROM sbb_data ORDER BY RAND() LIMIT ?';
EXECUTE STMT USING @nrRows;
基本上你要问的是基于变量 (@nrRows
) 的限制,它应该取 [0, 5].
随机选择5行,然后给它们分配一个新的随机数;选择新随机数小于 0.5 的行(平均选择一半的数字,但可能 none,可能全部)。
SELECT *
FROM (SELECT * FROM sbb_data ORDER BY RAND() LIMIT 0,5) rand5
WHERE RAND() < 0.5
例如:https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=c80a90b08e77e5e6448991d589f39df4