我如何在没有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
显然更有效,并且总是选择uniqueuserid
,但是类型
总是等于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的值随机化呢?谢谢你的提示和描述性的回答,这正是我所需要的,也是非常有效的。