2015-04-03 72 views
1

我有一個存儲有關電子書信息的數據庫,它由5個表,即MS訪問SQL - 從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和books:tags之間的多對多關係的聯結表。

現在我想要做的就是使用多個條件來搜索特定的圖書。

例如,我想要得到的姓名和身份證符合以下標準書的,

  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實現這種類型的搜索?謝謝。

+0

您可能會簡化爲僅加入您正在談論的2個表格而不是全部5 – Randy 2015-04-03 12:05:21

+0

@Randy感謝您的評論。不能這樣做,因爲這樣會使代碼複雜化(VBA)。我希望上面的SQL根據任何標準執行搜索。例如,如果我想使用作者姓名+ 5標籤+部分書名來搜索圖書。 – chemkatku 2015-04-04 15:32:06

回答

0

我在網上找了一些解決方案後找到了解決方案。

是由五個表生成的問題加入與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訪問SQL引擎將支持DISTINCT聚合函數裏面。請參閱本作的詳細信息:How do I count unique items in field in Access query?

因此,我最終的解決辦法是:

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條款已經被一分爲二。