【问题标题】:Is it possible to do an SQL query across two tables?是否可以跨两个表进行 SQL 查询?
【发布时间】:2011-01-23 10:36:06
【问题描述】:

我有几个如下所示的表格:

___________ ___________ |书籍 | |标签 | |-----------| |-----------| | 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?

【问题讨论】:

  • 我真的不明白你的问题。你想要什么输出?
  • SELECT 列中的 tag_name 不是多余的吗?它只能返回您正在搜索的“小说”?

标签: sql many-to-many jointable


【解决方案1】:

是的,你可以做到;加入:

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

【讨论】:

    【解决方案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';
    

    【讨论】:

      【解决方案3】:

      您需要加入所有三个表

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

      【讨论】:

        猜你喜欢
        • 2014-06-09
        • 2010-09-08
        • 2021-03-08
        • 2011-07-06
        • 2021-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        相关资源
        最近更新 更多