mysql - 无法确定 WHERE 子句应该是什么

标签 mysql sql database join

我坚持创建一个 MySQL 查询。下面是我的数据库结构。

作者(author_id 和 author_name)

书籍(book_id 和 book_title)

books_authors是链接表(book_id和author_id)

所有书籍和作者的结果:

img

我需要获取某个作者的所有书籍,但如果一本书有 2 个作者,则还必须显示第二个作者。例如,book_id=2 的书“Good Omens”有两个作者。当我运行查询时,我得到了 author_id=1 的书,但我不能在结果中包含第二作者 - “Neil Gaiman”。查询是:

SELECT * FROM books 
   LEFT JOIN books_authors 
       ON books.book_id=books_authors.book_id 
   LEFT JOIN authors 
       ON books_authors.author_id=authors.author_id 
WHERE books_authors.author_id=1

下面是结果:

最佳答案

您需要像这样更改 WHERE 子句来执行子查询:

SELECT b.*, a.*
FROM books b
LEFT JOIN books_authors ba ON ba.book_id  = b.book_id
LEFT JOIN authors       a  ON a.author_id = ba.author_id
WHERE b.book_id IN (
  SELECT book_id
  FROM books_authors
  WHERE author_id=1)

您的查询的问题是 WHERE 子句不仅过滤了您在结果集中获得的书籍,还过滤了书籍作者关联。

通过此子查询,您首先使用作者 ID 来过滤书籍,然后使用这些书籍 ID 获取所有关联的作者。

顺便说一句,我确实认为在这种特定情况下用 INNER JOIN 替换 OUTER JOIN 的建议应该适用。 books_authors 上的第一个 LEFT OUTER JOIN 肯定是无用的,因为 WHERE 子句保证每个选定的 book_id 在该表中至少存在一行。第二个 LEFT OUTER JOIN 可能没用,因为我希望 author_id 是 authors 表的主键,我希望 books_authors 表有一个外键和 author_id 的 NOT NULL 约束...这一切都意味着你不应该有一个不引用特定作者行的 books_authors 行。

如果这是真的并得到证实,那么查询应该是:

SELECT b.*, a.*
FROM books b
JOIN books_authors ba ON ba.book_id  = b.book_id
JOIN authors       a  ON a.author_id = ba.author_id
WHERE b.book_id IN (
  SELECT book_id
  FROM books_authors
  WHERE author_id=1)

请注意,在大多数情况下,INNER JOIN 可能比 OUTER JOIN 更有效(它们为引擎提供了更多关于如何执行语句和获取结果的选择)。因此,如果不是绝对必要,您应该避免使用 OUTER JOIN。

我添加了别名并从结果集中删除了冗余列。

关于mysql - 无法确定 WHERE 子句应该是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23640896/

相关文章:

python - 在 mySQL 上设置 UTF8

mysql - 如何将大型 csv 文件导入 mysql?

SQL Server 列加密

sql - 行到列

database - Disqus 是否存储您的评论?

mysql - 使用不同的列名连接 MySQL 中的两个表

php - 如何在php中限制用户每天登录一次以上

php - 查询图像到数据库

database - 从 1.4.200 升级 H2 版本 2.0.202

php - 外键防止删除mysql中的数据