2013-06-01 3 views
2

조인 된 테이블 중 하나에 일대 다 관계가있는 꽤 큰 쿼리에서 COUNT를 수행해야합니다. 이것은 모든 데이터가 일대 다 테이블의 'many'측면에서 항목이 반복되는 횟수로 곱해 지므로 내 결과를 포기합니다.일대 다 테이블 조인에서 mysql count (*)

이것은 문제를 강조하기 위해 단지 관련 부분을 보여주는 쿼리의 단축 버전 :

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 제외하고는 매우 straighforward됩니다 :

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 
version_id COUNT(trimtype)  
44   45 
54   35 
69   45 
214   50 
216   30 
282   5 
290   50 

어떻게이 문제를 방지하기 위해 :대신 나는 즉, 모든 카운트가 m_versions 테이블에 반복 VERSION_ID 횟수 인 5를 곱한 값이 무엇입니까? 감사합니다.

+0

당신이 COUNT (DISTINCT trimtype)''로 교체하면? –

+1

'COUNT (DISTINCT trimtype)'으로 바꾸면'where' 절에서'2' 값만 필터링하기 때문에 최대 값은'2'가됩니다. 'trimtype IN ('sec', 'help') .... ' –

+0

JW가 맞습니다. 나는 trimtype에 대해 DISTINCT를 시도하고 그 다음에 version_id에 대해 시도했지만 내가 찾고있는 것을 얻지 못했습니다. – 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

당신을 환영합니다':)' –