2011-04-13 34 views
1

我创建了一个简单的测试案例:MySQL的左连接多个表的一个一对多的关系

CREATE TABLE `t1` (
    `id` int NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) 

CREATE TABLE `t2` (
    `id2` int NOT NULL AUTO_INCREMENT, 
    `id1` int, 
    PRIMARY KEY (`id2`) 
) 

CREATE TABLE `t3` (
    `id3` int NOT NULL AUTO_INCREMENT, 
    `id1` int, 
    PRIMARY KEY (`id3`) 
) 

insert into t1 (id) values (1); 

insert into t2 (id1) values (1),(1); 

insert into t3 (id1) values (1),(1),(1),(1); 

我需要从T1选择所有不同的数据离开从t1加入t2和不同的数据左连接T3,返回总共6行,1 x(2 [from t2] + 4 [from t3])= 6,但由于这个连接的性质,我得到8行,1 [从t1] x 2 [from t2] x 4从T3] = 8

select * from t1 left join t2 on (t1.id = t2.id1); 
2 rows in set (0.00 sec) 

select * from t1 left join t3 on (t1.id = t3.id1); 
4 rows in set (0.00 sec) 

select * from t1 left join t2 on (t1.id = t2.id1) left join t3 on (t1.id = t3.id1); 
8 rows in set (0.00 sec) 

select * from t1 left join t2 on (t1.id = t2.id1) union select * from t1 left join t3 on (t1.id = t3.id1); 
4 rows in set (0.00 sec) 

我应该使用什么查询得到公正的6排我需要的,是更多钞票没有子查询的或我需要他们(这将是更complicatet我在我需要这个大查询)?
我需要一个大的查询,我已经从8个表中获取数据,但我需要从2个以上的数据获取所有数据,我只需要一个查询,但是当加入第9个表时,返回的数据得到的副本(在这个简单的测试案例中的第9个表格将是t3,而第8个将是t2)。

我希望有人能告诉我正确的道路。
谢谢。

更新解决: 我真的不知道如何在一个选择做这个测试案例,但在我的大查询我解决这样说:我东阳使用GROUP_CONCAT和group by,我做到了通过劈裂在multipe GROUP_CONCAT(DISTINCT ...)和CONCAT所有这些值这样

// instead of this 
... group_concat(DISTINCT concat(val1, val2, val3)) ... 
// I did this 
concat(group_concat(DISTINCT val1,val2), group_concat(DISTINCT val1,val3)) ... 

等价值小团体的独特阻止所有这些重复的。

+0

你怎么能有一个默认值的主键? – 2011-04-13 12:28:52

+0

@nick rulez:我没有注意到,我将t2中的列,t3中的id从id更改为id2,id3和mysql将默认值更改为更新问题。 ...:P – 2011-04-13 12:55:19

回答

0

我不知道,如果你在这个解决方案

select * from t1 left join t2 on (t1.id = t2.id1); 
union all 
select * from t1 left join t3 on (t1.id = t3.id1); 
+0

我开始用子查询来做大查询,它似乎是唯一的可能性。我会让问题持续几天,看看有人会教我们另一种方式。 – 2011-04-13 13:00:13

+0

由于滥用UNION ALL,这会抛出_Error Code:1064_。 – 2012-04-23 20:02:06

0

我认为在@nick rulez的查询一个小小的失误寻找。如果它是这样写的,它真的返回6行:

(SELECT * FROM t1 LEFT JOIN t2 ON (t1.id = t2.id1)) 
    UNION ALL 
(SELECT * FROM t1 LEFT JOIN t3 ON (t1.id = t3.id1))