【发布时间】:2017-01-27 02:22:25
【问题描述】:
我试图从名为 book_info 和 copy_info 的表中获取行信息的结果,然后(如果它们存在)来自名为 publisher 的表(其外键在 copy_info 中),并且(如果它们存在)结果通过名为 books_genres 的连接表从表名流派中获取。下面,$safe_copy_id 是在 php 语句中定义的,为了示例,我将其保留。
这行得通:
SELECT * FROM book_info, copy_info
LEFT OUTER JOIN publisher ON copy_info.publisher_id = publisher.publisher_id
WHERE book_info.book_id = copy_info.book_id
AND copy_info.copy_id = $safe_copy_id LIMIT 1
这很有效:
SELECT * FROM book_info, copy_info, books_genres
LEFT OUTER JOIN genre ON books_genres.genre_id = genre.genre_id
WHERE book_info.book_id = copy_info.book_id
AND copy_info.copy_id = $safe_copy_id LIMIT 1
但我真正想做的是:
SELECT * FROM book_info, copy_info, books_genres
LEFT OUTER JOIN publisher ON copy_info.publisher_id = publisher.publisher_id
LEFT OUTER JOIN genre ON books_genres.genre_id = genre.genre_id
WHERE book_info.book_id = copy_info.book_id
AND copy_info.copy_id = $safe_copy_id LIMIT 1
我应该在这里嵌套一些东西吗?不知道如何前进,并希望有任何见解。
【问题讨论】:
-
简单规则:从不在
FROM子句中使用逗号。 始终使用正确、明确的JOIN语法。这可能会解决您的问题。 -
@GordonLinoff 我从 FROM 子句中删除了逗号。我不确定这是否是您的意思,但我从每个连接子句中删除了“LEFT OUTER”,只说 JOIN。不幸的是,这不起作用。
-
我不确定第二个查询是如何工作的。
books_genres与book_info或copy_info没有连接条件。您是否正在寻找来自book_genres的笛卡尔积?如果您为所有表格提供 2 行并基于此提供预期输出,这将有所帮助。 -
@Ustav 对不起,我现在意识到第二个查询只返回流派表中的第一个结果,无论 copy_id 是什么。我将努力编辑它以包含一个连接条件。我的错。
标签: sql join outer-join