mysql左边连接多个表,一对多关系

时间:2011-04-13 11:47:01

标签: 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左连接t2中选择所有DISTINCT数据,从t1左连接t3中选择DISTINCT数据,返回总共6行,1 x(2 [从t2] + 4 [从t3])= 6,但是由于这个连接的性质我得到8行,1 [从t1] x 2 [从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行,它是否可以没有子查询或我需要它们(在我需要它的大查询中会更复杂?)
我需要这个用于大型查询,其中我已经从8个表中获取数据,但是我需要从另外2个表中获取数据以获得我在一个查询中所需的所有数据,但是当加入第9个表时,返回的数据得到重复(这个简单测试用例中的第9个表是t3,第8个表是t2)。

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

更新已解决: 我真的不知道如何在一个选择中做这个测试用例,但是在我的BIG查询中我用这种方式解决了:因为我使用了group_concat和group by,我是通过在multipe group_concat(DISTINCT ...中分割一个值)来做到的。并且像这样结束所有这些

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

因此,小组价值的独特性会阻止所有这些重复。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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))