Sql 多个联接独立工作,但不在一起工作
我试图获取来自名为book_info和copy_info的表的行信息的结果,然后(如果存在)来自名为publisher的表(其外键位于copy_info中)的结果,以及(如果存在)通过名为books_genres的连接表来自表名流派的结果。下面,$safe\u copy\u id是在一个php语句中定义的,为了示例起见,我将其保留了下来。Sql 多个联接独立工作,但不在一起工作,sql,join,outer-join,Sql,Join,Outer Join,我试图获取来自名为book_info和copy_info的表的行信息的结果,然后(如果存在)来自名为publisher的表(其外键位于copy_info中)的结果,以及(如果存在)通过名为books_genres的连接表来自表名流派的结果。下面,$safe\u copy\u id是在一个php语句中定义的,为了示例起见,我将其保留了下来。 这是有效的: SELECT * FROM book_info, copy_info LEFT OUTER JOIN publisher ON copy_inf
这是有效的:
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
是不是我应该在这里筑巢?不知道如何前进,希望有任何见解 只需正确地使用
JOIN
:
SELECT *
FROM book_info bi JOIN
copy_info ci
ON bi.book_id = ci.book_id JOIN
publisher p
ON ci.publisher_id = p.publisher_id JOIN
books_genres bg
ON bg.book_id = bi.book_id JOIN -- your question doesn't specify the JOIN condition here
genre g
ON bg.genre_id = g.genre_id
WHERE ci.copy_id = $safe_copy_id
LIMIT 1;
您缺少对图书类型的加入。也许它链接到了book\u info
此外,我认为没有理由在查询中使用外部联接。我怀疑所有的表都有有效的外键关系。感谢Gordon Linoff和Utsav指出我没有加入book_类型。以下是实际有效的查询:
SELECT * FROM
book_info bi JOIN copy_info ci
ON bi.book_id = ci.book_id
LEFT OUTER JOIN publisher p
ON ci.publisher_id = p.publisher_id
LEFT OUTER JOIN books_genres bg
ON bg.book_id = bi.book_id
LEFT OUTER JOIN genre g
ON bg.genre_id = g.genre_id
WHERE ci.copy_id = $safe_copy_id
LIMIT 1;
简单规则:切勿在FROM
子句中使用逗号。始终使用正确、明确的JOIN
语法。这可能会解决您的问题。@GordonLinoff我从from子句中删除了逗号。我不确定这是否是您的意思,但我从每个join子句中删除了“leftouter”来表示join。不幸的是,这不起作用。我不确定第二个查询是如何工作的。books\u-genres
与book\u-info
或copy\u-info
都没有连接条件。您是否正在从图书类型中寻找笛卡尔产品?如果您为所有表和基于此的预期输出提供2行,这将有所帮助。@Ustav对不起,我现在意识到第二个查询只返回流派表的第一个结果,而不管副本id是什么。我将对其进行编辑,以包含连接条件。我的错误。您是对的,图书类型链接到图书信息,我尝试运行这个精确的查询,用正确的链接替换了???,但仍然失败。感谢您纠正我的语法。我使用了外部联接,因为不是每个副本id都会从发布者或流派表返回行。我不确定具体原因,但如果我使用just-JOIN,它会返回null,而如果我使用outer-JOIN,它只会为特定列返回null(例如,genre_-id)。这是我对我的经验最好的解释,我不知道这是否是正确使用外部联接。@KaariLandry。看起来很合理。只需将所有的JOIN
s替换为LEFT JOIN
s即可。