【问题标题】:MYSQL Group By Returning Duplicate ValuesMYSQL 通过返回重复值分组
【发布时间】:2015-07-22 05:43:16
【问题描述】:

我发现 MYSQL GROUP BY 有一个奇怪的问题。

我有一个问题...

SELECT    schools.schoolregion, 
          Count(schools.schoolregion) AS regioncount, 
          ( 
                 SELECT Count(jobs_jobsubject) 
                 FROM   'jobs' 
                 WHERE  'jobs_createdDate' BETWEEN '$startofyear' 
                 AND    '$endofyear') AS regionjobstotal
FROM      'jobs' 
LEFT JOIN 'schools' 
ON        'jobs_schoolID'='SID' 
WHERE     'jobs_createdDate' BETWEEN '$startofyear' 
AND       '$endofyear' 
GROUP BY  'schoolRegion'

...我正在尝试按地区和按地区汇总列出的职位发布数量。我有两张表,一张是学校列表,另一张是工作信息,其列值连接回学校。我需要区域总数,以及一个时间段内的工作总数(因此是子查询)。

当我运行这个查询时,我得到了我所期望的一切——除了我在 GROUP BY 函数的返回结果中得到一个重复的区域列表。

例如,这是我得到的表,但不确定为什么中东的重复。

 schoolRegion     regioncount   regionjobstotal
  Africa               1             38
  Asia                 6             38
  Middle East          20            38
  Middle East          11            38

我认为可能有一个额外的字符或其他东西,但我找不到/看到表中的值有什么不同 - 对于该列,这些值被存储为“文本”类型。有什么我可以检查的吗?它与查询有关吗?

任何帮助都会非常棒,非常感谢!

【问题讨论】:

    标签: mysql group-by duplicates


    【解决方案1】:

    我的猜测是数据不是按 schoolRegion 排序的。我会在您的查询中添加一个ORDER BY schoolRegion ASC,以确保它们是这样组织的。 :)

    【讨论】:

    • 感谢您的建议。这不是解决方案,但我确实将它包含在查询中。
    • 啊.. 我知道你发现了问题.. 当你说你验证数据都是一致的时,我不应该相信你...... :) :) 很高兴它成功了。
    【解决方案2】:

    天哪,我是不是觉得自己像个菜鸟!!

    当我调整查询以列出学校时,只有一所学校未包含在 GROUP BY 中。最初,当我在几个小时前查看这个时,PHPMYADMIN 中的内联编辑没有显示在文本之后有一个字符返回 - 所以我注销了它是正在存储的值的文本。但是当我选中该框以单独编辑行而不是内联并转到该列值时 - 低并且看哪 - 回车!!!有时正是这样的小事杀死了我并让我谦卑。

    【讨论】:

      【解决方案3】:

      首先,我认为您不能在父选择语句“(SELECT COUNT(jobs_jobSubject)...”中提供子选择语句作为列。 此外,由于您的子选择和父选择的 where 子句是相同的,为什么不使用单个选择语句并获取两者的计数。

      SELECT schools.schoolRegion,
      COUNT(schools.schoolRegion) AS regioncount,
      COUNT(jobs_jobSubject) AS regionjobstotal
      FROM 'jobs' jb
      INNER JOIN 'schools' sc ON jb.jobs_schoolID=sc.SID
      WHERE 'jobs_createdDate' 
      BETWEEN '$startofyear' AND '$endofyear'
      GROUP BY 'schoolRegion'
      

      【讨论】:

      • 提问者可能需要COUNT(jobs_jobSubject)不乘以schools中的匹配行数;所以他仍然需要一个子查询(或至少一个COUNT(DISTINCT ))。不过看起来他用的方法也不太对。
      • 感谢两位的支持和帮助。我很好奇你所说的“但看起来他使用的方法也不完全正确”是什么意思。我通过在互联网上搜索我想要完成的解决方案来自学所有这些。我想确保我以正确和最有效的方式进行操作。
      • 再次阅读您的问题时,我将提出两种可能的解决方案;尝试使用 INNER JOIN 而不是 LEFT JOIN 并尝试命名您的表以实现有效的连接语句。我已经编辑了代码来告诉你我的意思
      猜你喜欢
      • 1970-01-01
      • 2021-01-29
      • 2021-08-27
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多