2013-10-31 44 views
1

我一直被困在这一点上。我有3个表,并希望将表2和表3匹配到不同列上的表1。如何在多列上左连接3个表格

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    
-------------------------------------------- 

我一直想的是:

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; 

我回国的任务,但不能从ITEM1或ITEM2的信息...在这里任何帮助与正确的语法,将不胜感激。

+1

检查该SO链接,你会发现有用的信息和示例:http://stackoverflow.com/a/11180050/1291428 – Sebas

回答

2

你为什么要做一个cross join?只需要做两个left join S:

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; 

这将保留所有记录tasks,与来自其它表中的所有匹配字段一起。

注意:您不应该混合使用on条款和where条款join条件。事实上,这个规则很简单。避免where条款join s。始终使用on

+0

谢谢...我想我是过度思考。此外,我没有意识到这是混合ON和WHERE的糟糕形式。我的左连接后使用WHERE任务可以吗? –

+0

@AndrewSinagra。 。 。在'from'子句中使用'''是一种糟糕的形式。如果你想要一个“交叉连接”,那么就要明确。现代连接语法与旧式连接相比有几个优点。但是,是的,您仍然可以使用具有现代连接语法的“where”子句。 –

0

尝试

SELECT tasks.id AS taskID, item1.name AS item1Name, item2.name AS item2Name 
    FROM tasks LEFT JOIN 
    ON tasks.item1_id = item1.id 
    LEFT JOIN item2 on tasks.item1_id = item2.id 
    JOIN users on users.task_id = tasks.id 
    JOIN notes on notes.task_id = tasks.id; 
    WHERE users.task_id = tasks.id 
    AND notes.task_id = tasks.id; 
1

只要这样的:

SELECT 
    tasks.is AS taskId, 
    item1.item1_name AS item1Name, 
    item2.item2_name AS item2Name 
FROM tasks 
JOIN users ON users.task_id = tasks.id 
JOIN notes ON notes.task_id = tasks.id 
LEFT JOIN item1 ON item1.id = tasks.item1_id 
LEFT JOIN item2 ON item2.id = tasks.item2_id