Mysql-5.6
排除多對多關係
我創建了一個選擇語句,顯示分配給一本書的所有主題。現在我正在嘗試創建一個 Select 語句,顯示所有未分配給本書的主題。書籍和主題具有多對多的關係。
問題:我得到了分配給其他書籍的主題,因為從技術上講它們沒有分配給我的書。
深入了解:我有一個裝滿書籍的數據庫。一本書可以有很多主題,一個主題可以有很多書。我已經創建了一個使用者界面來添加一本書。此界面顯示使用者選擇時可用的所有主題讓我們說三個主題在 books_has_topics 表中創建了三個記錄,一個欄位具有書籍的 ID,另一個欄位用於主題。我還有一個用於更新圖書的使用者界面。我希望使用者能夠更改主題。
程式碼:
這個作品它給了我一個基於書籍ID分配給書籍的所有列表。
SELECT * FROM topic T INNER JOIN book_has_topic BHT ON T.topic_id = BHT.topic_topic_id WHERE BHT.Book_book_id = [bookid];
這類作品我不僅獲得了所有未分配給 bookid 的主題,而且還獲得了分配給其他書籍的所有主題。
SELECT DISTINCT topic_id, topic_name FROM topic T LEFT JOIN book_has_topic BHT ON T.topic_id = BHT.topic_topic_id WHERE BHT.book_book_id IS NULL or BHT.book_book_id <> [bookid];
我更像是一個 MS SQL 人,所以如果我的語法對 mysql 有點偏離,請原諒,但我可能會選擇這樣的東西。
SELECT topic_id, topic_name FROM topic T WHERE NOT EXISTS ( SELECT TOP 1 1 FROM book_has_topic BHT WHERE BHT.topic_topic_id = topic_id AND BHT.book_book_id = [bookid])
(
TOP
MySQL 不知道。LIMIT
不需要它的對應項。)SELECT topic_id, topic_name FROM topic T WHERE NOT EXISTS ( SELECT 1 FROM book_has_topic BHT WHERE book_id = [bookid] AND topic_id = T.topic_id )
關於最佳多:多模式的提示。
可能你很接近這種
LEFT JOIN
方法:SELECT DISTINCT topic_id, topic_name FROM topic T LEFT JOIN book_has_topic BHT ON T.topic_id = BHT.topic_topic_id AND BHT.book_book_id = [bookid] WHERE BHT.book_book_id IS NULL
注3 更改為
AND BHT.book_book_id = [bookid]
–shange toAND
、move toON
、change tok=
。但這大概還是需要
DISTINCT
的。因此,使用“半連接” (EXISTS
) 更有效。