如何ORDER BY RAND()并随机设置LIMIT ?



我想提取随机行,我希望每次运行时行数变化
我怎么能做到这一点?

这是我的表

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;

选取概率为"5"的每一行是预期数,但它可以大于或小于5。limit 5限制为5。

如前所述,这将比其他数字更频繁地选择5行。您可能希望4.0 / cnt3.0 / cnt的分布更均匀。

而且,即使在中等大小的数据上,这也比order by rand()快得多。

随机选择5行,然后分配一个新的随机数;选择新随机数小于0.5的行(平均选中一半的数字,但也可能一个都不选中,也可能全部选中)。

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

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.5LIMIT 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]之间的值。

最新更新