2010-01-26 3 views
2

가능하다는 것을 알고 있지만 하위 쿼리를 수행하는 방법을 충분히 알지 못합니다. 나는 이것이 매우 일반적인 상황이라고 생각하위 쿼리의 다른 테이블에서 특정 행의 수를 얻는 방법

Table 1: 
+--------------------+--------------------+ 
|    v_id |    v_name | 
+--------------------+--------------------+ 
|     1 |   v_name1 | 
+--------------------+--------------------+ 
| etc... 

Table 2: 
+--------------------+--------------------+ 
|    a_id |    a_name | 
+--------------------+--------------------+ 
|     1 |   a_name1 | 
+--------------------+--------------------+ 
| etc... 

Table 3: 
+--------------------+--------------------+ 
|    v_id |    a_id | 
+--------------------+--------------------+ 
|     1 |     1 | 
+--------------------+--------------------+ 
|     1 |     2 | 
+--------------------+--------------------+ 
|     1 |     3 | 
+--------------------+--------------------+ 
|     2 |     3 | 
+--------------------+--------------------+ 
|     2 |     1 | 
+--------------------+--------------------+ 

:
여기 상황이다.
따라서 Table 1Table 2에 고유 항목이 있습니다.
의 모든 행을 SELECT으로 만들고 각 행의 마지막 셀로 Table 3의 해당 값을 갖는 행 수를 얻으려고합니다.

이 작동하지 않습니다

SELECT t1.* , COUNT(SELECT t3.* FROM `table_3` t3 WHERE t3.v_id = t1.v_id) as entries 
FROM `table 1` t1; 

을 나는거야가이 모든 잘못,하지만 솔직히 것을 여기에 전문가들에 의해 떨어져 말 할 수 있어요 확신, 그게 내가 원하는 (그리고 약간의 도움이있어 무엇 솔루션도!). ;)

답변

4

사용 :

SELECT t1.*, 
      COALESCE(x.num_rows, 0) AS entries 
    FROM `table 1` t1 
LEFT JOIN (SELECT t3.v_id, 
        COUNT(*) 'num_rows' 
      FROM `table_3` t3 
     GROUP BY t3.v_id) x ON x.v_id = t1.v_id 
+0

+1 너는 나를 때렸다. –

+0

대단히 감사합니다! :) –

3
SELECT t1.* , (SELECT COUNT(*) FROM `table_3` t3 WHERE t3.v_id = t1.v_id) as t3Count as entries 
FROM `table 1` t1; 
+1

서브 쿼리가 큰 결과 집합의 성능에 영향을 미칠 외부 선택의 각 행에 대해 실행됩니다. – davek

+0

요즘 거의 모든 데이터베이스 시스템에서 사용되는 계획을 보면 상관 된 하위 쿼리가 조인으로 실행된다는 것을 알 수 있습니다. 이 방법을 사용하면 값을 계산하면 t1에서 반환 된 행 수를 더하거나 뺄 수 없다는 것을 명확하게 알 수 있습니다. –

2
SELECT T1.v_id, COALESCE(COUNT(T3.v_id), 0) 
FROM Table1 AS T1 
LEFT JOIN Table3 AS T3 
ON T1.v_id = T3.v_id 
GROUP BY T1.v_id