【问题标题】:MySQL counting gender instancesMySQL 计算性别实例
【发布时间】:2013-03-16 04:36:46
【问题描述】:

我有以下 MySQL 查询。

USE demo;
SELECT 
  loc.name,
  sum(case cr_sex when 'F' then 1 else 0 end) as 'F#', 
  sum(case cr_sex when 'M' then 1 else 0 end) as 'M#'
FROM case_report_main as cr 
JOIN location as loc on cr.cr_name = loc.name
GROUP BY loc.name

这按我想要的方式工作,它计算每个性别的每次出现并按位置名称对其进行分组。但是当我尝试将它与另一个表加入时

USE demo;
SELECT 
  loc.name,
  sum(case cr_sex when 'F' then 1 else 0 end) as 'F#', 
  sum(case cr_sex when 'M' then 1 else 0 end) as 'M#'
FROM case_report_main as cr 
JOIN location as loc on cr.cr_name=loc.name
JOIN map_polygons as mp on mp.polygon_name=loc.name
GROUP BY loc.name

值完全混乱,返回数千而不是预期的数十和数百。

认为我理解这个问题,附加表增加了行数。我不确定如何解决这个问题,或者这是否真的是问题所在。

【问题讨论】:

    标签: mysql sql select join


    【解决方案1】:

    因为可能有记录在表map_polygons 上有多个匹配项导致对性别的计数无效,请尝试将第一个查询放在子查询中,

    SELECT  mp.*,
            loc.name
            loc.`F#`
            loc.`M#`
    FROM
            (
                SELECT  loc.name,
                        sum(case cr_sex when 'F' then 1 else 0 end) as 'F#', 
                        sum(case cr_sex when 'M' then 1 else 0 end) as 'M#'
                FROM case_report_main as cr 
                JOIN location as loc on cr.cr_name = loc.name
                GROUP BY loc.name
            ) loc
            INNER JOIN map_polygons mp on mp.polygon_name=loc.name 
    

    顺便说一下,既然是mysql,可以把boolean结果加起来,让它更短

    SELECT  mp.*,
            loc.name
            loc.`F#`
            loc.`M#`
    FROM
            (
                SELECT  loc.name,
                        sum(cr_sex = 'F') as 'F#', 
                        sum(cr_sex = 'M') as 'M#'
                FROM case_report_main as cr 
                JOIN location as loc on cr.cr_name = loc.name
                GROUP BY loc.name
            ) loc
            INNER JOIN map_polygons mp on mp.polygon_name=loc.name 
    

    【讨论】:

    • 是的,这似乎奏效了。谢谢!我想我需要努力理解子查询。萨拉马特卡巴扬。
    • 没问题卡巴扬。如果你需要的话,这里还有一篇关于加入的好文章。 Visual Representation of SQL Joins
    【解决方案2】:

    在 map_polygon 表中,你的 polygon_name 是唯一的吗?这不是唯一的,您可能需要在选择字段中进行更改

    SELECT 
      loc.name,
      count(distinct case cr_sex when 'F' then cr.id else null end) as 'F#', 
      count(distinct case cr_sex when 'M' then cr.id else null end) as 'M#'
    FROM case_report_main as cr 
    JOIN location as loc on cr.cr_name=loc.name
    JOIN map_polygons as mp on mp.polygon_name=loc.name
    GROUP BY loc.name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2016-03-03
      • 2011-08-04
      • 1970-01-01
      相关资源
      最近更新 更多