簡體   English   中英

MS Access SQL-從5個表中搜索

[英]MS Access SQL - Searching from 5 tables

我有一個數據庫,存儲有關電子書的信息,它由5個表組成,即

  1. 圖書(book_id,book_name,book_rating)
  2. 作者(author_id,author_name)
  3. BOOK_AND_AUTHORS(ba_id,book_id,author_id)
  4. 標記(tag_id,tag_name)
  5. BOOKS_AND_TAGS(bt_id,book_id,tag_id)

每本書都有一個或多個作者和一個或多個標簽(以對其進行分類)。 BOOKS_AND_AUTHORSBOOKS_AND_TAGS是用於維護book:authors和book:tags之間多對多關系的聯結表。

現在,我要做的是使用多個條件使用sql搜索特定的書。

例如,我要獲取符合以下條件的書名和ID,

  1. 評級為2或以上
  2. 只能使用標記ID的2和219表示標記; 不允許使用其他標簽。

我的解決方案包括以下內容。

SELECT DISTINCT books.book_id, books.book_name 

FROM 
    (
    (tags INNER JOIN books_and_tags ON tags.tag_id = books_and_tags.tag_id)

    INNER JOIN 

        (books INNER JOIN 

            (authors INNER JOIN  books_and_authors 
            ON authors.author_id = books_and_authors.author_id) 

        ON books.book_id = books_and_authors.book_id) 

    ON books_and_tags.book_id = books.book_id
    )

WHERE ((BOOKS.book_rating >= 2)  AND ((TAGS.tag_id) IN (2,219))) 
GROUP BY BOOKS.book_id, BOOKS.book_name
HAVING COUNT(TAGS.tag_id) = 2

不幸的是,這並沒有返回我想要的。 我做錯了嗎? 有什么建議如何使用SQL實現這種類型的搜索? 謝謝。

經過網上搜索后,我找到了解決方案。

該問題是由五個表聯接和SQL語句的以下部分生成的:

WHERE ((BOOKS.book_rating >= 2)  AND ((TAGS.tag_id) IN (2,219))) 
GROUP BY BOOKS.book_id, BOOKS.book_name
HAVING COUNT(TAGS.tag_id) = 2

在連接了五個表之后,在某些預期情況下, COUNT(TAGS.tag_id) = 2將不會被評估為TRUE。 這是因為在由聯接操作生成的結果集中,給定書包含許多重復行。 因此, COUNT...部分在某些情況下將失敗。 為了克服這個問題,COUNT應該只考慮不同的tag_id。 解決方案應該是這樣的,

HAVING COUNT (DISTINCT TAGS.tag_id) = 2

如果只有MS Access SQL引擎將支持聚合函數中的DISTINCT 請參閱此以獲取更多信息: 如何在Access查詢的字段中計算唯一項?

因此,我的最終解決方案是:

SELECT DISTINCT books.book_id, books.book_name 
FROM 

    (SELECT DISTINCT tags.tag_id, books.book_id, books.book_name 
    FROM (
        (tags INNER JOIN books_and_tags ON tags.tag_id = books_and_tags.tag_id)

        INNER JOIN 

            (books INNER JOIN 

                (authors INNER JOIN  books_and_authors 
                ON authors.author_id = books_and_authors.author_id) 

            ON books.book_id = books_and_authors.book_id) 

        ON books_and_tags.book_id = books.book_id

        ) WHERE (BOOKS.book_rating >= 2) [+ all the other conditions NOT based on tags]
    )

WHERE (TAGS.tag_id) IN (2,219) 
GROUP BY BOOKS.book_id, BOOKS.book_name
HAVING COUNT(TAGS.tag_id) = 2

請注意,原始的WHERE子句已被拆分為兩個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM