首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL快速选择3个唯一的随机ID行,其中

问MySQL快速选择3个唯一的随机ID行,其中
EN

Stack Overflow用户
提问于 2013-11-30 22:17:04
回答 3查看 399关注 0票数 1

我需要能够从一个随时间逐渐增长的表中选择3个唯一的随机MySQL ID行,并且有一个WHERE 'status‘= 'available’。因此,它只在status = available时选择id号。

不会有差距,因为所有的数据都是为了记录合规性而保留的,如果用户删除了数据,那么它实际上并没有被删除,只是状态被标记为“已删除”。

我读了很多关于这个主题的帖子,但似乎都归结为只选择一个结果,然后重复3次,问题是,它可能会再次选择相同的ID,所以我的问题的任何解决方案都将非常感谢。

谢谢

:)

我正在考虑做这样的事情(取自这里... MySQL select 10 random rows from 600K rows fast)

代码语言:javascript
复制
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。这是我的问题:)

EN

回答 3

Stack Overflow用户

发布于 2013-11-30 22:23:08

你有没有尝试:

代码语言:javascript
复制
SELECT *
FROM mytable
WHERE status = 'available'
ORDER BY RAND( )
LIMIT 0,3;
票数 2
EN

Stack Overflow用户

发布于 2013-12-01 13:12:02

代码语言:javascript
复制
SELECT DISTINCT *
FROM table
WHERE status = 'available'
ORDER BY RAND()
LIMIT 3

DISTINCT子句应防止重复值。ORDER BY RAND()将随机组织结果。

票数 0
EN

Stack Overflow用户

发布于 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 (并在该链接中查找变体)

  • 要求: AUTO_INCREMENT,可能由于删除等导致的间隙
  • 缺陷:仅半随机(行被挑选的机会不相等),但它确实部分弥补了间隙
  • 缺陷:表的第一行和最后几行不太可能被交付。

这将获得50个“连续”的ids (可能有间隙),然后随机提供其中的10个。

代码语言:javascript
复制
-- 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;

是的,它很复杂,但是,不管表的大小,它都是很快的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20301290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档