首页 文章

是否可以跨两个表执行SQL查询?

提问于
浏览
0

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

___________    ___________
| 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?

3 回答

  • 2

    是的,你可以做;加入:

    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'
    )
    
  • 0

    是的,您可以在一个查询中执行此操作,这称为 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';
    
  • 4

    你需要加入所有三个表

    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';
    

相关问题