MySQL左连接

时间:2012-01-26 15:39:33

标签: mysql join left-join

编辑:好的,我想我需要更清楚 - 我希望结果能够显示表格中出现的所有“名称”,以及结果表中的计数(如果有的话)。希望有道理吗?

有一个巨大的问题,我的大脑不能正常工作。

我想要做的就是,通过连接在单个语句中,计算公共字段的行数。

   SELECT name, COUNT(name) as Count FROM acme
   SELECT name, COUNT(name) as Total FROM results

我确定它应该是这样的......

   SELECT acme.name, COUNT(acme.name) As Count, 
          COUNT(results.name) as Total 
   FROM acme 
   LEFT JOIN results ON acme.name = results.name 
   GROUP BY name 
   ORDERY BY name

但它没有带回正确的数字。

思考,我哪里出错......我知道,这将非常明显。

小时。

4 个答案:

答案 0 :(得分:2)

根据您的反馈,这将得到您想要的。您需要首先从“ACME”文件中获取唯一的名称/计数...然后将其连接到结果表中以获取记录的计数,否则,最终会得到笛卡尔计数结果。如果ACME的名称为“X”5次,结果的“X”为20次,则总数为100.下面的查询实际上会产生一行显示“X”,5,20,这就是你看起来的样子for ..(因为ACME中存在许多名称)。

如果ACME表中的名称在结果表中不存在,我已更改为LEFT联接,它不会从最终答案中删除它们

select
      JustACME.Name,
      JustACME.NameCount,
      COALESCE( COUNT( * ), 0 ) as CountFromResultsTable
   from
      ( select a.Name
               count(*) as NameCount
           from
              acme a
           group by
              a.Name ) JustACME

      LEFT JOIN results r
         on JustACME.Name = r.Name
   group by
      JustACME.Name

答案 1 :(得分:0)

看起来这是因为加入,它与你的计数紧密相关。尝试使用SELECT * FROM ...运行连接,然后查看结果表。问题应该从那里明显。 = d

答案 2 :(得分:0)

是的,您的加入(内部或外部,无关紧要)会影响您的结果。

事实上,它可能会返回具有相同名称的行的 product ,而不是总和。

您要做的是对第一个表中的行求和,对第二个表中的行求和,然后加入

像这样:

Select name, a.count as Count, r.count as Total
From (select name, count(*) from acme group by name) a
Left join (select name, count(*) from results group by name) r using (name)

答案 3 :(得分:0)

我不明白为什么你禁止使用两个语句这只会使一切变得复杂。 我看到的唯一原因是将两个结果合并为一个答案。 我不知道后者是否有效,但我会尝试这个:

SET @acount = (SELECT count(DISTINCT name) FROM acme);
SELECT count(DISTINCT name) as Total, @acount as Count FROM results

我会将此作为一个查询发布,并(希望)获得正确的结果。请注意,您不清楚自己是否想知道每个名字加倍的频率或是否想要计算唯一名称。