2013-06-01 85 views
2

我需要在相當大的查詢上執行COUNT,其中一個連接表具有一對多關係。這是拋棄我的結果,因爲所有數據都乘以在一對多表的「多」一邊重複項目的次數。與一對多表連接的mysql數(*)

這是查詢的縮短版只顯示相關的部分突出問題:

SELECT COUNT(trimtype) FROM versiontrim 
INNER JOIN trims USING (trim_id) 
INNER JOIN prices USING(version_id) 
INNER JOIN m_versions USING(version_id) 
WHERE trimtype IN('sec', 'help') AND price BETWEEN 200001 AND 210000 
GROUP BY version_id 

所有表都只是m_versions相當簡單明瞭具有一個一對多的關係,看起來是這樣的:

version_id  serv_id 

    1     1 
    1     2 
    1     3 
    1     4 
    1     5 
    .... and so on 

查詢的預期結果是:

version_id COUNT(trimtype)  
44   9 
54   7 
69   9 
214   10 
216   6 
282   1 
290   10 

相反,我正在此,即所有罪狀乘以5這是VERSION_ID在m_versions表重複次數:

version_id COUNT(trimtype)  
44   45 
54   35 
69   45 
214   50 
216   30 
282   5 
290   50 

如何避免這種情況? 謝謝

+0

如果你用'COUNT(DISTINCT trimtype)'更換? –

+1

如果你用'COUNT(DISTINCT trimtype)'替換它,最大值將是'2',因爲你只在'where'子句中爲'2'值過濾。 '在哪裏trimtype IN('sec','help')....' –

+0

JW是對的。我對trimtype和version_id都嘗試了DISTINCT,但沒有得到我正在尋找的內容。 – BernardA

回答

2

它匹配表m_version上的多個記錄,這就是爲什麼你會得到無效的結果。嘗試它包裹的子查詢,

INNER JOIN (SELECT DISTINCT version_id FROM m_versions) m USING(version_id) 

UPDATE

所以完整的查詢看起來是這樣,

SELECT version_id, COUNT(trimtype) 
FROM versiontrim 
     INNER JOIN trims USING (trim_id) 
     INNER JOIN prices USING(version_id) 
     INNER JOIN (SELECT DISTINCT version_id FROM m_versions) m USING(version_id) 
WHERE trimtype IN('sec', 'help') AND price BETWEEN 200001 AND 210000 
GROUP BY version_id 
+0

奇妙的JW,就是這樣!不斷學習新事物。我完全不知道你可以在JOIN中使用子查詢。非常感謝! – BernardA

+0

不客氣':)' –