如何在多列上左联接3个表

And*_*gra 2 mysql sql mysqli left-join

我在这上面停留了一段时间。我有3个表,并且想将表2和3与表1的不同列匹配。

tasks:
id      | item1_id       | item2_id   
--------------------------------------------
1       | 4              | 5   
2       | 5              | 6   
3       | 6              | 7  
--------------------------------------------

item1:
id      | item1_name     
--------------------------------------------
4       | item1_a              
5       | item1_b              
6       | item1_c              
--------------------------------------------

item2:
id      | item2_name     
--------------------------------------------
5       | item2_a              
6       | item2_b              
7       | item2_c              
--------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我一直在尝试的是:

SELECT tasks.id AS taskID, item1.name AS item1Name, item2.name AS item2Name
FROM tasks LEFT JOIN (item1 CROSS JOIN item2) 
ON (tasks.item1_id = item1.id AND tasks.item2_id = item2.id),
users, notes 
WHERE users.task_id = tasks.id
AND notes.task_id = tasks.id;
Run Code Online (Sandbox Code Playgroud)

我正在返回任务,但不是来自item1或item2的信息。在这里,如果使用正确的语法提供任何帮助,将不胜感激。

Gor*_*off 5

你为什么要做cross join?只需执行两个left joins:

SELECT tasks.id AS taskID, item1.name AS item1Name, item2.name AS item2Name
FROM tasks LEFT JOIN
     item1
     on tasks.item1_id = item1.id LEFT JOIN
     item2
     on tasks.item2_id = item2.id LEFT JOIN
     users
     on users.task_id = tasks.id LEFT JOIN
     notes
     on notes.task_id = tasks.id;
Run Code Online (Sandbox Code Playgroud)

这会将所有记录保留在中tasks,以及其他表中的所有匹配字段。

注意:您不应join同时使用on子句和where子句来混合条件。实际上,规则很简单。s的Eschew where子句join。始终使用on