- mysql - two left joins - double counting
- table1
- id
- table2
- id | val (each id has 1 of 3 possible values)
- table3
- id | val (each id has 1 of 3 possible values)
- SELECT
- count(DISTINCT table1.id) AS x1,
- SUM(IF(table2.val='1'),1,0)) AS x2,
- SUM(IF(table2.val='2'),1,0)) AS x3,
- SUM(IF(table2.val='3'),1,0)) AS x4,
- SUM(IF(table3.val='1'),1,0)) AS x5,
- SUM(IF(table3.val='2'),1,0)) AS x6,
- SUM(IF(table3.val='3'),1,0)) AS x7
- FROM
- table1
- LEFT JOIN
- table2 ON table1.id=table2.id
- LEFT JOIN
- table3 ON table1.id=table3.id
- SELECT
- count(view1.id) AS x1,
- SUM(IF(table2.val='1'),1,0)) AS x2,
- SUM(IF(table2.val='2'),1,0)) AS x3,
- SUM(IF(table2.val='3'),1,0)) AS x4,
- SUM(IF(table3.val='1'),1,0)) AS x5,
- SUM(IF(table3.val='2'),1,0)) AS x6,
- SUM(IF(table3.val='3'),1,0)) AS x7
- FROM
- ( SELECT DISTINCT table1.id
- FROM table1
- ) view1
- LEFT JOIN
- table2 ON view1.id=table2.id
- LEFT JOIN
- table3 ON view1.id=table3.id
- SELECT
- SumForTable1.x1,
- SumForTable2.x2,
- SumForTable2.x3,
- SumForTable2.x4,
- SumForTable3.x5,
- SumForTable3.x6,
- SumForTable3.x7
- FROM
- ( select count(DISTINCT table1.id) AS x1
- from table1 ) SumForTable1,
- ( select SUM(IF(table2.val='1'), 1, 0)) AS x2,
- SUM(IF(table2.val='2'), 1, 0)) AS x3,
- SUM(IF(table2.val='3'), 1, 0)) AS x4
- from table2 ) SumForTable2,
- ( select SUM(IF(table3.val='1'), 1, 0)) AS x5,
- SUM(IF(table3.val='2'), 1, 0)) AS x6,
- SUM(IF(table3.val='3'), 1, 0)) AS x7
- from table3 ) SumForTable3
- SELECT
- count(t1.id) AS t1,
- SUM(IF(t2.val=1,1,0)) AS t21,
- SUM(IF(t2.val=2,1,0)) AS t22,
- SUM(IF(t2.val=3,1,0)) AS t23,
- SUM(IF(t3.val=1,1,0)) AS t31,
- SUM(IF(t3.val=2,1,0)) AS t32,
- SUM(IF(t3.val=3,1,0)) AS t33
- FROM (SELECT DISTINCT * FROM table1) as t1
- JOIN (SELECT DISTINCT * FROM table2) as t2 ON t1.id=t2.id
- JOIN (SELECT DISTINCT * FROM table3) as t3 ON t1.id=t3.id;