【发布时间】:2015-04-03 10:24:56
【问题描述】:
我有一个存储电子书信息的数据库,它由 5 个表组成,即,
- 书籍(book_id、book_name、book_rating)
- 作者(作者 ID,作者姓名)
- 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 和 books: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 实现这种类型的搜索?谢谢。
【问题讨论】:
-
您可以简化为仅加入您正在谈论的 2 个表,而不是全部 5 个
-
@Randy 感谢您的评论。不能这样做,因为这样做会使代码(VBA)复杂化。我希望上述 SQL 根据任何条件执行搜索。例如,如果我想使用作者姓名 + 5 个标签 + 部分书名来搜索一本书。
标签: sql ms-access-2010