Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多个联接独立工作,但不在一起工作_Sql_Join_Outer Join - Fatal编程技术网

Sql 多个联接独立工作,但不在一起工作

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

我试图获取来自名为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_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即可。