[英]MS Access SQL - Searching from 5 tables
我有一個數據庫,存儲有關電子書的信息,它由5個表組成,即
- 圖書(book_id,book_name,book_rating)
- 作者(author_id,author_name)
- BOOK_AND_AUTHORS(ba_id,book_id,author_id)
- 標記(tag_id,tag_name)
- BOOKS_AND_TAGS(bt_id,book_id,tag_id)
每本書都有一個或多個作者和一個或多個標簽(以對其進行分類)。 BOOKS_AND_AUTHORS
和BOOKS_AND_TAGS
是用於維護book:authors和book:tags之間多對多關系的聯結表。
現在,我要做的是使用多個條件使用sql搜索特定的書。
例如,我要獲取符合以下條件的書名和ID,
- 評級為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.