SELECt useridFROM UserRoleWHERe roleid IN (1, 2, 3)GROUP BY useridHAVINg COUNT(DISTINCT roleid) = 3;
任何人阅读本:我的答案是简单明了的,并得到了“接受”的地位,但请不要去阅读答案通过@cletus给出。它具有更好的性能。
只是大声思考一下,@ cletus所描述的编写自联接的另一种方法是:
SELECt t1.useridFROM userrole t1JOIN userrole t2 ON t1.userid = t2.useridJOIN userrole t3 ON t2.userid = t3.useridWHERe (t1.roleid, t2.roleid, t3.roleid) = (1, 2, 3);
这对您来说可能更容易阅读,并且MySQL支持类似的元组比较。MySQL还知道如何针对此查询智能地利用覆盖索引。只需运行它,
EXPLAIN并在所有三个表的注释中看到“使用索引”,这意味着它正在读取索引,甚至不必触摸数据行。
我在Macbook上使用MySQL 5.1.48对这个查询进行了210万行查询(PostTag的Stack Overflow
7月数据转储),它在1.08秒内返回了结果。在分配了足够内存的体面服务器上
innodb_buffer_pool_size,它甚至应该更快。



