2017-03-06 115 views
0

我理解左连接应该做什么?MySQL左连接比单独的“左”表更大吗?

我有一个查询。将其称为查询A.它返回19条记录。

我有另一个查询,查询B.它返回1,400条记录。

我插入查询B插入查询作为左加入,让查询A变成:

SELECT * 
FROM tableA 
LEFT JOIN (<<entire SQL of Query B>>) ON tableA.id = tableB.id 

现在,左连接意味着一切从表A,并从B表只记录了他们相匹配。所以无论如何,这个混合查询不应该返回比原始查询A返回的19条记录更多的东西。我实际得到的是1,000条记录。

我从根本上误解了LEFT JOIN的工作原理吗?

+0

什么是'tableA'和tableB'之间的关系行?如果'tableA'与'tableB'有一个_one-to-many_关系,那么结果集听起来正确。 – Cameron

+0

例如3 x 3 = 9 – Strawberry

回答

2

你并不完全误解LEFT JOIN,其结果暗示了这一点。如果你在A中只有一行,在B中有1000在B中引用A中单行的ID;你的结果将是1000行。 你忽略了这种关系可能是一对多关系。“左”表/子查询的大小(取决于WHERE条件)是下界的结果数量。

+0

啊......这可能正是我所需要的。因此,我可能需要类似DISTINCT或GROUP BY的东西来收紧。 –

+0

其他答案也很有用;但这是第一次,并给了我我需要的东西。谢谢 –

+0

@StephenR“DISTINCT”或“GROUP BY”的功能在这种情况下比INNER JOIN或甚至简单的单一表“SELECT”更有用。 – Uueerdo

1

是的,你有点误解。

现在,左连接意味着表A中的所有内容,并且只有表B中的记录匹配。

到目前为止,这么好:只有根据您在ON子句中指定的规则与表A匹配时,表B中的数据才会包含在内。

所以无论如何,这个混合查询应该不会超过原始查询A返回的19条记录。

这似乎是很有道理,直到你意识到表B多行可以在表A匹配同一行。假设你在表A中有两行,一个是A_ID=1,另一个是A_ID=3;其中一行是A_ID=1,另一个是A_ID=3;另一个是A_ID=3。表B中10行;表B中的5行具有A_ID=1,并且5具有A_ID=2。表B中的所有行对于B_ID具有不同的值。

如果您使用左连接且条件A_ID必须匹配,您会得到哪些行?

  • 从表A与A_ID=3该行会出现一次,与B_ID一个NULL值,因为在表B没有行与之匹配。
  • 表B中的5行与A_ID=2完全不会显示,因为它们不匹配表A中的任何行。
  • 来自表B的5行与A_ID=1全部显示出来,每个与来自表A的1行与A_ID=1合作。

所以,你得到6分的结果,即使当时只有2表A