2015-04-03 49 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条款已经被一分为二。