2016-03-09 78 views
0

这已经有一段时间,因为我做了任何的MySQL,所以我可能只是忘了一些基本的东西在这里 - 但这里是我的情况:COUNT和SUM成倍

(的简化版本我表)

表A(2行)

D_ID

d_nm

d_active

表B(符合D_ID#1 10行,匹配D_ID#2 0行)

T_ID

t_nm

D_ID

t_active

表C(11个与d_nm#1匹配的行(共49个6)中,匹配d_nm 2#)

C_ID其中0行

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大小

1 ------- ------- D1 10 ----- --- 496

2 ------- ------- D2 0 0 ----------

实际结果:

D_ID --- d_nm --- tcount ---大小

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

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

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

回答

0

想出了这个,它的工作原理。与其将常规左连接添加到整个表中,我只将Left连接到表中的查询结果。由于目前我的数据量很小,运行这两个查询的时间是可比的。不知道随着表的大小增长会不会有任何性能命中?如果有人知道更好的方式,请让我知道!

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