我需要能够从一个随时间逐渐增长的表中选择3个唯一的随机MySQL ID行,并且有一个WHERE 'status‘= 'available’。因此,它只在status = available时选择id号。
不会有差距,因为所有的数据都是为了记录合规性而保留的,如果用户删除了数据,那么它实际上并没有被删除,只是状态被标记为“已删除”。
我读了很多关于这个主题的帖子,但似乎都归结为只选择一个结果,然后重复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这给了我所需要的,但它只返回一个随机的唯一“选择”,加上如果我限制它为3,它并不总是选择3,如果它选择3,它们似乎总是顺序的,而不是随机的!
有没有一种方法可以重复查询,存储选择的ID,并保持循环/运行查询,直到随机选择3个不同的ID。这是我的问题:)
发布于 2013-11-30 22:23:08
你有没有尝试:
SELECT *
FROM mytable
WHERE status = 'available'
ORDER BY RAND( )
LIMIT 0,3;发布于 2013-12-01 13:12:02
SELECT DISTINCT *
FROM table
WHERE status = 'available'
ORDER BY RAND()
LIMIT 3DISTINCT子句应防止重复值。ORDER BY RAND()将随机组织结果。
发布于 2017-05-07 11:29:52
请看下面的内容;当它谈到"gaps“时,你就有了等价的(status=deleted) http://mysql.rjweb.org/doc.php/random#case_auto_increment_with_gaps_1_or_more_rows_returned (并在该链接中查找变体)
这将获得50个“连续”的ids (可能有间隙),然后随机提供其中的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;是的,它很复杂,但是,不管表的大小,它都是很快的。
https://stackoverflow.com/questions/20301290
复制相似问题