2014-04-08 5 views
2

MySQL 데이터베이스에는 두 개의 테이블이 있습니다. tbl1의 행 수가 tbl2에 일치하는지 계산해야합니다. 여기에 단순화 된 관련 테이블 구조입니다 :이 tbl2 많은 행이 TBL1에서 경기를하는 방법을 알려줍니다 생각합계가 일치하는 행을 계산합니다.

SELECT code, label FROM tbl1 INNER JOIN tbl2 ON tbl1.code=tbl2.code1 
WHERE reltype='desiredtype'; 

:

tbl1 
    code (pk) 
    label 

tbl2 
    id 
    code1 (fk to tbl1.code if there is a match for a given row) 
    reltype 

와 내가 시작하려면 다음 SQL을 가지고있다. 이 올바른지? 또한 게시 이유는 입니다. tbl1의 일치하는 행 수가 tbl2 인 행을 결정하려면 어떻게해야합니까?

아마도
+0

tbl2에 둘 이상의 일치 항목이있을 수 있습니까? – attila

답변

3
select count(*) from tbl1 
where code in (select code1 from tbl2) 

? 최적화를 위해서는 distinct(code1)이 필요할 수 있습니다.

+0

+1 이것은 reltype 열에 대한 기준을 제외하고 지정된 결과를 반환해야합니다. 'IN (subquery)'는 외부 쿼리에 의해 반환 된 각 행에 대해 MySQL이 하위 쿼리를 처리하는 방식 때문에 MySQL에서 실제 성능을 발휘할 수 있습니다. 보다 효율적인 접근 방법이 있습니다. (reltype에 OP 기준이 포함되어야하는지 여부는 명확하지 않습니다.) – spencer7593

+1

@Chrisky +1 그리고 고맙습니다. 이것은 매우 큰 데이터 파일에서 2 초 이내에 실행됩니다. – CodeMed

1
SELECT 
    COUNT(tbl1.code) 
FROM 
    tbl1 INNER JOIN tbl2 ON tbl1.code=tbl2.code1 
WHERE 
    tbl2.reltype='desiredtype' 
GROUP BY 
    tbl1.code 
+0

첫 번째 응답자가되어 주셔서 감사합니다. 나는 당신의 질의를 실행했고, tbl1에 8 배의 행을줍니다. 나는 tbl1의 전체 행 수의 0 %에서 100 % 사이에서 작동하는 숫자를 원합니다. 어떻게이 코드를 수정합니까? – CodeMed

+0

다행입니다. 나는 질의를 변경했다. 수표를 가지고있다. – potashin

+0

+1 및 감사합니다. 수정 된 코드는 카운트 번호 대신 일치하는 모든 행을 인쇄합니다. 그러나 행의 수는 바삭 바삭한 코드에 의해 생성 된 카운트 수와 같습니다. 코드가 실행되는 데는 3 분 30 초가 걸리는 반면 버전은 2 초 이내에 동일한 번호를 제공합니다. – CodeMed

1
SELECT 
    COUNT(t1.code) Cnt 
FROM tbl1 T1 
    JOIN tbl1 T2 
    ON T1.code = T2.code1 
WHERE T2.reltype='desiredtype' 
GROUP BY T1.code 
1

귀하의 질문은 맞습니다. 내부 조인은 tbl1과 tbl2 모두에서 고유 한 일치가있는 경우 제공합니다.

SELECT tb1.code, tb1.label FROM tbl1 INNER JOIN tbl2 ON tbl1.code=tbl2.code1 
WHERE reltype='desiredtype'; 

다른 경우에는 왼쪽 조인 또는 오른쪽 조인을 사용할 수 있습니다.

+0

이 tbl2''에 일치하는 행이 tbl1''에서 행의 수를 반환하지 않습니다. 당신이 수() 메소드를 사용할 수 있습니다 spencer7593 @ – spencer7593

+0

는 다른 답변에서와 같이 행의 수를 얻을 수 있습니다 –

1

몇 가지 접근법이 있습니다.

tbl1에 PRIMARY KEY가 있으면 주어진 것과 유사한 쿼리를 수행 할 수 있지만 GROUP BY tbl1.pk을 추가하면 중복을 제거하고 해당 쿼리를 인라인보기로 참조하여 해당 행의 개수를 얻을 수 있습니다 질문. (가장 효율적인 방법은 아닙니다.)

카운트를 원할 경우 SELECT COUNT(DISTINCT tbl1.pk)을 수행하도록 쿼리를 수정할 수 있습니다. COUNT() 집계 내의 DISTINCT 수정자는 고유 값만 계산합니다. 즉, 표현의 중복 값은 COUNT()에 포함되지 않습니다. 이 가능성이 가장 효율적인 방법 :

SELECT COUNT(DISTINCT tbl1.code) 
    FROM tbl1 
    JOIN tbl2 
    ON tbl2.code1 = tbl1.code 
    AND tbl2.reltype='desiredtype'; 

여러 가지 다른 대안. 한 가지 방법은 인라인보기에 가입하여 tbl2와 별개의 목록을 가져 오는 것입니다 (예 :

SELECT COUNT(1) 
    FROM tbl1 
    JOIN (SELECT tbl2.code1 
      FROM tbl2 
     WHERE tbl2.reltype = 'desiredtype' 
     GROUP BY tbl2.code1 
     ) d 
    ON d.code1 = tbl1.code 
관련 문제