2

次の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

値は完全に台無しになり、予想される数十から数百ではなく数千を返します。

問題は理解できたと思います。テーブルを追加すると行数が増えます。しかし、これを修正する方法や、これが実際に問題であるかどうかはわかりません。

4

2 に答える 2

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 
于 2013-03-16T04:41:43.800 に答える
0

map_polygon テーブルで、ur 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
于 2013-03-16T05:13:13.473 に答える