如何 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 / cnt3.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