【问题标题】:MySQL Left JoinsMySQL 左连接
【发布时间】:2012-01-26 15:39:32
【问题描述】:

编辑:好的,我想我需要更清楚 - 我希望结果显示出现在表 acme 中的所有“名称”,与结果表中的计数(如果有的话)相对。希望这有意义吗?

有一个大问题,我的大脑无法正常工作。

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

   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

但它并没有恢复正确的计数。

想想,我哪里错了……我知道,这将非常非常明显。

H.

【问题讨论】:

  • 你为什么使用左外连接而不是内连接????
  • 你能发布表格的架构吗?

标签: mysql join left-join


【解决方案1】:

根据您的反馈,这将得到您想要的。您需要首先从“ACME”文件中获取唯一名称/计数...然后将其连接到结果表中以获取记录计数,否则,您最终会得到笛卡尔计数结果。如果 ACME 有 5 次名称“X”而结果有 20 次“X”,那么您的总数将是 100。下面的查询实际上会导致单行显示“X”、5、20,这就是您正在查看的内容for..(无论 ACME 中存在多少名称)。

如果 ACME 表中的名称在 RESULTS 表中不存在,我已更改为 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

【讨论】:

  • 见上文,如果有的话,需要将所有出现在 acme 中的名称与结果中的计数相对应。
  • @Homer_J,也请参阅修订后的答案.... Acme 表是否会有多个条目用于给定名称,并且结果也有多个条目用于相同的给定名称?或者... ACME 表是否只显示它想要的唯一名称(即:acme 表中每个名称只有一个),并查看它在“结果”表中出现的次数。这就是为什么您对这两个表都感到困惑并试图加入它们的原因。
  • 两个表中有多个条目 - 我认为这让我很头疼:-(
  • @Homer_J,为你再修改一次……想想你想要的。
  • 出现错误 :-( - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,了解在 'count(*) as NameCount 附近使用的正确语法跨度>
【解决方案2】:

看起来是因为加入,它搞砸了你的计数。尝试使用 SELECT * FROM... 运行连接并查看结果表。从那里问题应该很明显。 =D

【讨论】:

    【解决方案3】:

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

    事实上,它很可能返回product 的同名行,而不是总和。

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

    像这样:

    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)
    

    【讨论】:

    • 谢谢,但似乎无法让它工作,只带回 1 行?
    【解决方案4】:

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

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

    我会将其作为一个查询发布并(希望)取回正确的结果。请注意,您不清楚您是想知道每个名称重复的频率还是要计算唯一名称。

    【讨论】:

    • 感谢您的反馈,但已整理好!
    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多