使用多个LEFT JOIN时,COUNT和SUM正在相乘

时间:2016-03-09 23:04:04

标签: mysql join count group-by sum

我已经有一段时间了,因为我已经完成了任何MySQL,所以我可能只是忘记了一些基本的东西 - 但这是我的情况:

(我表格的简化版)

表A (2行)

D_ID

d_nm

d_active

表B (10行与d_id#1匹配,0行与d_id#2匹配)

T_ID

t_nm

D_ID

t_active

表C (11行匹配d_nm#1(总计496),0行匹配d_nm#2)

C_ID

c_nm

d_nm

尺寸1

size2个

查询:

SELECT 
    a.d_id,
    a.d_nm,
    COUNT(b.t_id) AS tcount,
    SUM(c.size1+c.size2) AS size 
FROM TableA a 
LEFT JOIN TableB b 
ON (b.d_id=a.d_id AND b.t_active=1)
LEFT JOIN TableC c 
ON (c.d_nm=a.d_nm)
WHERE a.d_active=1 
GROUP BY a.d_id,a.d_nm 
ORDER BY a.d_nm

期望:

d_id --- d_nm --- tcount --- size

1 ------- d1 ------- 10 -------- 496

2 ------- d2 ------- 0 ---------- 0

实际结果:

d_id --- d_nm --- tcount --- size

1 ------- d1 ------- 110 ------- 5,456

2 ------- d2 ------- 0 ---------- 0

出于某种原因,它将tcount的结果乘以size中的记录数 - 反之亦然。我认为这是我的加入或我的小组的问题......但似乎无法让它出来正确!

1 个答案:

答案 0 :(得分:0)

想出了这个,有效。我没有将常规左连接执行到整个表,而只是将左连接到表中的查询结果。由于我的数据大小目前非常小,因此运行两个查询的时间相当。不确定随着表的大小增加会有任何性能命中?如果有人知道更好的方式,请告诉我!

SELECT a.d_id,a.d_nm,b.tcount,c.size FROM TableA a
LEFT JOIN(SELECT d_id,COUNT(t_id)AS tcount FROM TableB WHERE t_active=1 GROUP BY d_id)b ON(b.d_id=a.d_id)
LEFT JOIN(SELECT d_nm,SUM(size1+size2)AS size FROM TableC GROUP BY d_nm)c ON(c.d_nm=a.d_nm)
WHERE a.d_active=1 ORDER BY a.d_nm