选择满足不同行的不同条件的值?这是一个非常基本的查询,我想不出.假设我有一个像这样的两列表:userid | roleid
1 | 1
1 | 2
1 | 3
2 | 1我想得到所有不同的用户roleids使用上面的例子,我希望返回的唯一结果是userid1.我如何做到这一点?
3 回答
明月笑刀无情
TA贡献1828条经验 获得超4个赞
SELECT userid
FROM UserRole
WHERE roleid IN (1, 2, 3)
GROUP BY userid
HAVING COUNT(DISTINCT roleid) = 3;
读到这篇文章的人:我的答案简单明了,并且获得了“接受”的状态,但是请你去读一下回答由@Cletus提供。它的性能要好得多。
在大声思考时,@Cletus描述的另一种书写自我连接的方法是:
SELECT t1.userid
FROM userrole t1
JOIN userrole t2 ON t1.userid = t2.userid
JOIN userrole t3 ON t2.userid = t3.userid
WHERE (t1.roleid, t2.roleid, t3.roleid) = (1, 2, 3);
对于您来说,这可能更容易阅读,MySQL支持对这样的元组进行比较。MySQL还知道如何为该查询智能地使用覆盖索引。只要把它做完就行了EXPLAIN请参阅所有三个表的注释中的“使用索引”,这意味着它正在读取索引,甚至不必触摸数据行。
我在我的Macbook上使用MySQL5.1.48运行了这个查询超过210万行(PostTags的Stack溢出七月数据转储),并在1.08秒内返回了结果。在一个有足够内存分配给innodb_buffer_pool_size它应该更快。
添加回答
举报
0/150
提交
取消