2013-03-16 82 views
2

我有以下的MySQL查詢。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 

加入它的價值得到完全搞砸了,成千上萬的返回而不是預期的幾十上百個。

認爲我明白這個問題,附加表增加了行數。我不知道如何解決這個問題,或者如果這實際上是問題。

回答

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的,它ispossible總結布爾結果使其更短

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 
+1

是的,這似乎工作。謝謝! 我想我需要工作我對子查詢的理解。 Salamat kabayan。 – user1849239 2013-03-16 04:50:37

+0

kabayan沒問題。這裏也是一篇關於加入的好文章,如果你需要的話。 [SQL連接的可視化表示](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html) – 2013-03-16 04:53:20

0

在map_polygon表中,ur polygon_name是唯一的嗎?這是不是獨一無二的,你可能需要在選擇領域中的一個012

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