0

我有几个看起来像这样的表:

___________ ___________
| 书籍 | | 标签 |
|-----------| |-----------|
| book_id | | tag_id |
| 书名 | | 标签名 |
 ------------ ------------

还有一个连接“多对多关系”的连接表:

___________
| 书籍/标签|
|-----------|
| book_id |
| tag_id |
 ------------

我想做一个类似这样的查询:

SELECT book_name, tag_name FROM books, tags WHERE tag_name = 'fiction'

有没有办法将书籍表“附加”到查询中的标签,因为它们之间有一个连接表?还是我必须执行三个查询,一个获取 tag_id,另一个获取与 tag_id 匹配的 book_id,第三个获取与 tag_id 匹配的 book_name?

4

3 回答 3

4

是的,你可以;加入:

SELECT b.book_name, t.tag_name FROM books b
JOIN books_tags bt ON bt.book_id=b.book_id
JOIN tags t ON t.tag_id=bt.tag_id
WHERE t.tag_name = 'fiction';

这将返回具有“小说”标签的书籍列表。

或者,您可以使用子查询来做到这一点:

SELECT b.book_name FROM books b WHERE id IN (
    SELECT bt.book_id FROM books_tags bt
    WHERE bt.tag_id IN (
        SELECT t.tag_id FROM tags t WHERE t.tag_name='fiction'
    )
)

或者:

SELECT b.book_name FROM books b WHERE EXISTS (
    SELECT 1 FROM books_tags bt
    JOIN tags t ON t.tag_id=bt.tag_id
    WHERE t.tag_name='fiction'
)
于 2011-01-23T10:39:12.253 回答
2

是的,您可以在一个查询中执行此操作,这称为JOIN

SELECT book_name, tag_name FROM books
    JOIN bookTags ON books.book_id = bookTags.book_id
    JOIN tags ON booksTags.tag_id = tags.tag_id
    WHERE tag_name = 'fiction';
于 2011-01-23T10:39:05.617 回答
0

您将需要加入所有三个表

SELECT books.book_name, books.tag_name FROM books, bookTags, Tags
WHERE books.book_id = bookTags.book_id
AND booksTags.tag_id = Tags.tag_id
and Tag.tag_name = 'fiction';
于 2011-01-23T10:40:00.983 回答