MySQL如何进行3表连接

MySQL如何进行3表连接,mysql,sql,Mysql,Sql,我正试图在MySQL上执行一个3表连接,以实现类似下图的功能 我遇到的主要问题是,我只想处理表A的记录,表A有100条记录,因此如果正确的表没有关系,我希望看到空值 当只涉及表A和B时,这一切都很好,但是当我尝试与C进行第三次连接时,我得到了超过原来的100条记录,我得到了130条,我相信这是因为添加了与表A中的重复数据相匹配的B-C记录 我错过了什么 这是我目前拥有的能够正确返回100条记录的SQL SELECT count(A.id) FROM tableA A LEFT JOIN Tab

我正试图在MySQL上执行一个3表连接,以实现类似下图的功能

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

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

我错过了什么

这是我目前拥有的能够正确返回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

这可以通过将
连接到子查询而不是表来解决

如果您有唯一的ID要加入,那就好像您已经尝试过(任意示例):

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

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条记录与B-C匹配,有没有办法忽略重复的行?其中任何一个都适用于我,因为它们很可能包含相同的信息。我只是想花时间感谢您的评论。这有助于理解为什么我得到了比原始数量更多的唱片。解决方案是对第二个左连接使用子查询(您正在B&C之间创建链接,这与a无关),因此只需添加一个Where子句,使您的a.id不为空谢谢!这确实是问题的解决方案。
SELECT*
with
groupby
是一个讨厌的东西,任何数据库都不应该支持它。幸运的是,MySQL正在逐步取消对该构造的支持。
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
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