Mysql-5.6

排除多對多關係

  • December 15, 2021

我創建了一個選擇語句,顯示分配給一本書的所有主題。現在我正在嘗試創建一個 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])

TOPMySQL 不知道。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 to AND、move to ON、change tok =

但這大概還是需要DISTINCT的。因此,使用“半連接” ( EXISTS) 更有效。

引用自:https://dba.stackexchange.com/questions/240333