選擇滿足不同行的不同條件的值?這是一個非?;镜牟樵儯蚁氩怀?假設我有一個像這樣的兩列表: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
提交
取消