left join 多表关联原理

这个是我再别人那里拿的数据,还有他的问题

现在有 A,B,C,D四张表,A为主表,B、C、D都是子表,与A属于一对多关系。查询后出现大量重复数据

表A
-----------------------------------------------
cID                      Name
1                          张三
2                          李四

表B
-----------------------------------------------
cID                      Car
1                          本田飞度
1                          POLO

表C
-----------------------------------------------
cID                      Credit
1                          广发信用卡
1                          兴业信用卡
1                          民生信用卡

表D
-----------------------------------------------
cID                      Hose
1                          怡海花园14号楼201
1                          富锦家园7号楼702

查询语句

SELECT * FROM A LEFT JOIN B ON (A.cID = B.cID)  LEFT JOIN C ON (A.cID = C.cID)  LEFT JOIN D ON (A.cID = D.cID)

查询结果为

cID                  Name                   Car                      Credit                      Hose
1                      张三                      本田飞度             广发信用卡             怡海花园14号楼201
1                      张三                      本田飞度             广发信用卡             富锦家园7号楼702
1                      张三                      本田飞度             兴业信用卡             怡海花园14号楼201
1                      张三                      本田飞度             兴业信用卡             富锦家园7号楼702
1                      张三                      本田飞度             民生信用卡             怡海花园14号楼201
1                      张三                      本田飞度             民生信用卡             富锦家园7号楼702
1                      张三                       POLO                 广发信用卡             怡海花园14号楼201
1                      张三                       POLO                 广发信用卡             富锦家园7号楼702
1                      张三                       POLO                 兴业信用卡             怡海花园14号楼201
1                      张三                       POLO                 兴业信用卡             富锦家园7号楼702
1                      张三                       POLO                 民生信用卡             怡海花园14号楼201
1                      张三                       POLO                 民生信用卡             富锦家园7号楼702

我最终想实现的效果为:
cID                  Name                   Car                      Credit                      Hose
1                      张三                      本田飞度             广发信用卡             怡海花园14号楼201
                                                      POLO                  兴业信用卡             富锦家园7号楼702
                                                                                   民生信用卡       

我来推一下为什么会得到上面的数据

首先、AB表关联,得到一下数据:

cID        Name        Car     
1           张三           本田
1           张三           polo

然后,关联C表,mysql会将AB结果集做为一个整体,关联C,因为(A.cID = C.cID),从数据来看肯定满足,AB数据集的第一条,匹配了C表的3条数据,第二条也匹配了三条数据,然后就是

cID                  Name                   Car                      Credit
1                      张三                      本田                    广发信用卡
1                      张三                      本田                    兴业信用卡
1                      张三                      本田                    民生信用卡
1                      张三                      POLO                    广发信用卡
1                      张三                      POLO                    兴业信用卡
1                      张三                      POLO                    民生信用卡

再然后,ABC结果集关联D,分别是ABC结果的1,2,3,4,5,6,匹配两条房屋数据,得到以上的最后结果。

 

posted @ 2019-08-20 10:17  longtengdama  阅读(20980)  评论(0编辑  收藏  举报