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,PRIMARY KEY (`id3`)
)

insert into t1 (id) values (1);

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

insert into t3 (id1) values (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)) ... 
因此,不同的价值小群体可以防止所有这些重复。     

解决方法

我不确定您是否正在寻找这种解决方案
select * from t1 left join t2 on (t1.id = t2.id1);
union all
select * from t1 left join t3 on (t1.id = t3.id1);
    ,我认为@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))
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...