MySQL如何进行3表连接

时间:2017-10-10 19:33:01

标签: mysql sql

我正在尝试在MySQL上执行3个表连接,以实现类似下图的操作。

enter image description here

我遇到的主要问题是我只想处理具有100条记录的表A的记录,因此如果没有正确表的关系,我希望看到空值。

当只涉及表A和B时这一切都正常但当我尝试用C进行第三次连接时我得到的数量超过了原来的100条记录,我得到130,我相信是因为添加了与BC匹配的记录与表A中的重复数据。

我错过了什么?

这是我目前拥有的正确返回100条记录的SQL

SELECT count(A.id)
FROM tableA A
LEFT JOIN TableB B ON B.id = A.b_id

这就是我要做的,就是返回超过表A的原始100条记录。

SELECT count(A.id)
FROM tableA A
LEFT JOIN TableB B ON B.id = A.b_id
LEFT JOIN TableC C ON C.id = B.c_id

2 个答案:

答案 0 :(得分:0)

这可以通过JOIN解析为子查询而不是表。

如果你有独特的ID加入,那就像你已经尝试过一样(任意例子):

SELECT * from table1 t1
LEFT JOIN table2 t2 on t2.id = t1.id
LEFT JOIN table3 t3 on t3.id = t2.id

但是,如果id中的table3字段不是唯一的,那么每个副本都会有多行。您可以通过以下方式解决此问题:

SELECT * from table1 t1
LEFT JOIN table2 t2 on t2.id = t1.id
LEFT JOIN (SELECT * FROM table3 GROUP BY id) t3 on t3.id = t2.id

因此,使用您的示例(假设只有第三个连接具有重复项),类似于:

SELECT count(A.id)
FROM tableA A
LEFT JOIN TableB B ON B.id = A.b_id
LEFT JOIN (SELECT * FROM TableC GROUP BY id) C ON C.id = B.c_id

......应该做的伎俩。这取决于您的表和数据结构的假设,因此您可能希望更明确地使用星号。

答案 1 :(得分:0)

SELECT count(distinct A.id)
FROM tableA A
LEFT JOIN TableB B ON B.id = A.b_id
LEFT JOIN TableC C ON C.id = B.c_id