2010-10-15 34 views
0

我相信我在這裏缺少正確的術語,但在這個例子中許多一對多的關係:在一個多對多的關係,怎麼能集體所有的記錄中選擇

用戶具有很多書。一本書由許多用戶擁有。

查看兩個用戶擁有的所有圖書的最佳方式是什麼?

現在我只是用這樣的:

SELECT * FROM books 
WHERE book_id IN 
    (SELECT book_id FROM user_has_book WHERE user_id = 'joe' AND book_id IN 
    (SELECT book_id FROM user_has_book WHERE user_id = 'frank')) 

我知道不能做到這一點的最好辦法 - 對不對?我正在使用MySQL

+0

無論採用哪種方式,請確保在系統上進行基準測試,並在可能的情況下檢查執行計劃。 – Dlongnecker 2010-10-15 22:05:06

回答

1
SELECT b.* 
FROM books b 
INNER JOIN 
    (SELECT book_id, COUNT(*) as cnt 
    FROM user_has_book 
    WHERE user_id IN ('Frank', 'Joe')  
    GROUP BY book_id 
    HAVING cnt=2)x ON (x.book_id = b.book_id) 
相關問題