我想提取随机行,我希望每次运行时行数变化
我怎么能做到这一点?
这是我的表
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。
4.0 / cnt
或3.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.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]之间的值。