2016-03-09 117 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