我需要能够从一个逐渐增长并且随着时间的推移而增长的表中选择3个唯一的随机MySQL ID行,并且具有WHERE'status'='available'。因此,如果status = available,它只会选择id号。
没有差距,因为保留所有数据以保持记录符合性,如果用户删除了数据,实际上没有删除,只有STATUS被标记为“已删除”。
我已经阅读了很多关于这个主题的帖子但是这一切似乎都归结为只挑选了1个结果,然后重复了3次,问题是,它可能会再次选择相同的ID,所以任何解决我的问题的方法都会非常感谢。
谢谢
:)
我正在考虑做这样的事情 (取自这里...... MySQL select 10 random rows from 600K rows fast)
SELECT id
FROM table AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(id)
FROM table)) AS id2)
AS r2
WHERE r1.id >= r2.id2 AND status = 'available'
ORDER BY r1.id ASC
LIMIT 1
这给了我我需要的东西,但它只返回1个随机的“挑选”,加上我将其限制为3,它并不总是选择3,如果它确实选择3,它们似乎总是顺序的,这是不是随意的!
有没有办法重复查询,存储选中的ID并保持循环/运行查询,直到3个ID被选为AT RANDOM,这是不同的。这是我的问题:)
答案 0 :(得分:2)
你有没有尝试过:
SELECT *
FROM mytable
WHERE status = 'available'
ORDER BY RAND( )
LIMIT 0,3;
答案 1 :(得分:0)
SELECT DISTINCT *
FROM table
WHERE status = 'available'
ORDER BY RAND()
LIMIT 3
DISTINCT子句应防止重复的值。 ORDER BY RAND()将随机组织结果。
答案 2 :(得分:0)
见以下内容;它谈到"差距",你有等价物(状态=已删除)http://mysql.rjweb.org/doc.php/random#case_auto_increment_with_gaps_1_or_more_rows_returned (并在该链接中查找变体)
连续50" id(可能有间隙),然后随机发送10个。
-- First select is one-time:
SELECT @min := MIN(id),
@max := MAX(id)
FROM RandTest;
SELECT a.*
FROM RandTest a
JOIN ( SELECT id FROM
( SELECT id
FROM ( SELECT @min + (@max - @min + 1 - 50) *
RAND() AS start FROM DUAL ) AS init
JOIN RandTest y
WHERE y.id > init.start
ORDER BY y.id
LIMIT 50 -- Inflated to deal with gaps
) z ORDER BY RAND()
LIMIT 10 -- number of rows desired
) r ON a.id = r.id;
是的,它很复杂,但是,它是快速的,关于表格大小。