为了账号安全,请及时绑定邮箱和手机立即绑定

选择满足不同行的不同条件的值?

选择满足不同行的不同条件的值?

HUWWW 2019-07-25 14:14:38
选择满足不同行的不同条件的值?这是一个非常基本的查询,我想不出.假设我有一个像这样的两列表: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它应该更快。




查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 261 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信