我有几张看起来像这样的表:
___________ ___________ | Books | | Tags | |-----------| |-----------| | book_id | | tag_id | | book_name | | tag_name | ----------- -----------
连接“多对多关系”的连接表:
___________ | Books/Tags| |-----------| | book_id | | tag_id | -----------
我想做一个像这样的查询:
SELECT book_name, tag_name FROM books, tags WHERE tag_name = 'fiction'
有没有办法将books表“附加”到查询中的标签,因为它们之间有连接表?或者我是否必须执行三个查询,一个用于获取tag_id,另一个用于获取与tag_id匹配的book_id,第三个用于获取与tag_id匹配的book_name?
答案 0 :(得分: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'
)
答案 1 :(得分: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';
答案 2 :(得分: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';