3 回答

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個贊
SELECT userid
FROM UserRole
WHERE roleid IN (1, 2, 3)
GROUP BY userid
HAVING COUNT(DISTINCT roleid) = 3;
讀到這篇文章的人:我的答案簡單明了,并且獲得了“接受”的狀態(tài),但是請你去讀一下回答由@Cletus提供。它的性能要好得多。
在大聲思考時(shí),@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支持對這樣的元組進(jìn)行比較。MySQL還知道如何為該查詢智能地使用覆蓋索引。只要把它做完就行了EXPLAIN請參閱所有三個表的注釋中的“使用索引”,這意味著它正在讀取索引,甚至不必觸摸數(shù)據(jù)行。
我在我的Macbook上使用MySQL5.1.48運(yùn)行了這個查詢超過210萬行(PostTags的Stack溢出七月數(shù)據(jù)轉(zhuǎn)儲),并在1.08秒內(nèi)返回了結(jié)果。在一個有足夠內(nèi)存分配給innodb_buffer_pool_size它應(yīng)該更快。
添加回答
舉報(bào)