我如何在没有id/auto_increment列的情况下检索MySQL中的多个随机行?

我如何在没有id/auto_increment列的情况下检索MySQL中的多个随机行?,mysql,Mysql,我的目标 CREATE TABLE tbl_message_queue ( userid bigint(20) NOT NULL, messageid varchar(20) NOT NULL, `type` int(1) NOT NULL, PRIMARY KEY (userid,messageid,`type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 我正在尝试检索多个随机行,这些行只包含唯一的userid,但是如果type列是随机的,

我的目标

CREATE TABLE tbl_message_queue (
  userid bigint(20) NOT NULL,
  messageid varchar(20) NOT NULL,
  `type` int(1) NOT NULL,
  PRIMARY KEY (userid,messageid,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我正在尝试检索多个随机行,这些行只包含唯一的
userid
,但是如果
type
列是随机的,
type
只能是
0
1
。该表在任何给定时间都将包含少于1000行

我的桌子

CREATE TABLE tbl_message_queue (
  userid bigint(20) NOT NULL,
  messageid varchar(20) NOT NULL,
  `type` int(1) NOT NULL,
  PRIMARY KEY (userid,messageid,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
样本数据

userid  |   messageid   |   type
---------------------------------------------------
4353453 |   518423942   |   0
4353453 |   518423942   |   1
2342934 |   748475435   |   0
2342934 |   748475435   |   1
7657529 |   821516543   |   0
7657529 |   821516543   |   1
0823546 |   932843285   |   0
0823546 |   932843285   |   1
排除什么

使用
orderbyrand()
是不可行的,因为在任何给定时刻,应用程序都会执行至少18000个此类查询,并且会导致高负载。使用
SELECT DISTINCT
groupby
显然更有效,并且总是选择unique
userid
,但是
类型
总是等于
0
,负载可以接受

常用的方法是创建一个
id
列,但我正在寻找另一种方法。组主键不能根据需要更改,并且不能深入集成到我们的应用程序中,但是可以更改每列的结构


谢谢。

我对您的问题的理解是,对于每个
用户ID
,您有两个条目,但只想随机提取一个条目

要实现这一点,您应该为每个唯一的
用户ID
生成一个介于0和1之间的随机值,然后将此列表与起始列表连接起来:

SELECT a.* FROM tbl_message_queue AS a
    JOIN ( SELECT userid, FLOOR(2*RAND()) AS type 
           FROM tbl_message_queue GROUP BY userid ) AS b
    ON ( a.userid = b.userid AND a.type = b.type );
但是如果兰德公司的
订单()
不适合你,也许我们应该妥协

在上面的序列中,任何两个userid都是不相关的——也就是说,用户A获取类型0这一事实并不能告诉您用户B将出现什么

根据用例的不同,可以通过两个查询获得不太随机(但“明显随机”)的序列:

SELECT @X := FLOOR(2*RAND()), @Y := POW(2,FLOOR(2+14*RAND()))-1;

SELECT * FROM tbl_message_queue WHERE (((userid % @Y) & 1) XOR type XOR @X);

通过这种方式,您可以得到看起来是随机抽取的内容。真正发生的是,用户ID是相互关联的,您只有几十种不同的提取方法。但是只使用简单的运算符,不使用联接,此查询非常快速。

根据您的示例数据集,看起来唯一变化的值是“type”。既然只有1和0,为什么不把1和0的值随机化呢?谢谢你的提示和描述性的回答,这正是我所需要的,也是非常有效的。