2013-06-06 2 views
3

lists의 표가 있으며 각각은 posts입니다. 각 list의 각 posts이 얼마나 많은지 알려주는 쿼리를 원합니다. 게시물이없는 각 목록에 대해 0이 포함 된 항목이 포함되어 있습니다.GROUP BY를 포함하여 0 포함하지 않음

예 :

posts :

id | list_id 
-------------- 
1 | 1 
2 | 1 
3 | 2 
4 | 2 

lists : 나는 다음과 같은 쿼리를 사용하여 이렇게 한

list_id | num_posts 
------------------- 
1  | 2 
2  | 2 
3  | 0 

, 그러나 효과적으로 할 바보 조금 느낌 :

id 
--- 
1 
2 
3 

은 반환해야합니다 그룹화 한 다음 다른 하위 쿼리를 실행하여 bl을 채 웁니다. 답변 :

WITH "count_data" AS (
    SELECT "posts"."list_id" AS "list_id", COUNT(DISTINCT "posts"."id") AS "num_posts" 
    FROM "posts" 
    INNER JOIN "lists" ON "posts"."list_id" = "lists"."id" 
    GROUP BY "posts"."list_id" 
) 
SELECT "lists"."id", COALESCE("count_data"."num_posts", 0) 
FROM "lists" 
LEFT JOIN "count_data" ON "count_data"."list_id" = "lists"."id" 
ORDER BY "count_data"."num_posts" DESC 

감사합니다. 나는 당신의 질문을 이해하면

답변

5

직접 참여 왼쪽으로 더 효율적있을거야하는 서열 큰 병합 스캔 피하는 과정에 참여 :

select lists.id as list_id, count(posts.list_id) as num_posts 
from lists 
left join posts on posts.list_id = lists.id 
group by lists.id 
+0

니스, 나는'GROUPING BY''lists.id'에 대해 생각하지 않았습니다. 감사. – RobHeaton

0

이 작동합니다 :

SELECT List_ID, ISNULL(b.list_ID,0) 
FROM lists a 
LEFT JOIN (SELECT list_ID, COUNT(*) 
     FROM posts 
     GROUP BY list_ID 
    )b 
ON a.ID = b.list_ID 
관련 문제