2011-11-02 3 views
1

제 질문은 해결책을 시도한 similar to this one입니다. 그러나 제 시나리오에서는 정확하지 않았습니다.SQL 및 JOIN을 사용하여 집계표를 계산합니다 (가능합니까?)

나는 투표와 게시물이 2 개 있습니다. 여기에 기본 스케치은 다음과 같습니다

`posts` 
----+------------------------------------------------------------------------+ 
| ID | post_title               | 
+----+-----------------------------------------------------------------------+ 
| 1 | Hello world.               | 
| 2 | This is a post!              | 
| 3 | What is the meaning of life?           | 
| 4 | Looking for a good time?            | 
+----+----------------------------------------------------------------------- 

`votes` 
+----+---------+ 
| ID | post_id | 
+----+---------+ 
| 1 |  1 | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  3 | 
| 5 |  3 | 
| 6 |  4 | 
+----+---------+ 

문제 :

나는 각 게시물이 가지고 얼마나 많은 표를 알고, 가장 높은 투표에 게시물이 위에 있음을 표시 할

.

 Post ID Vote Count 
    +---------+-----------+ 
    | 1  | 3   | 
    | 3  | 2   | 
    | 4  | 1   | 
    | 2  | 0   | 

이 목표를 달성하기 위해 SQL 쿼리는 어떻게 생겼습니까?

답변

5
select post_id, count(*) 
from votes 
group by post_id 
order by count(*) desc 

편집 : 당신이 UINON을하지 않고 카운트 제로 투표와 게시물을 포함 할 경우

select v.post_id, count(*) 
from votes v INNER JOIN posts p ON v.post_id = p.id 
group by v.post_id 
order by count(*) desc 
+0

감사합니다. (id 대신 post_title을 표시하는 것이 훨씬 더 어려울까요?) –

+0

@Ankur는 게시물에 JOIN하고 SELECT 및 GROUP BY 절에 post_title을 추가합니다. –

+0

@Conrad Frix Thanks! –

3
SELECT post_id, COUNT(*) AS tally 
    FROM votes 
GROUP 
    BY post_id 
UNION 
SELECT ID AS post_id, 0 AS tally 
    FROM posts 
WHERE ID NOT IN (SELECT post_id FROM votes); 
+0

니스, 이것도 작동합니다. 대단한 코드. –

+0

+1에 제로 투표 게시물이 포함되어 있기 때문에 +1 –

0

당신은 SUM/CASE가

SELECT 
     p.id, 
     SUM(CASE WHEN v.post_id IS NOT NULL THEN 1 ELSE 0 END) AS tally 
    FROM 
     posts p 
     LEFT JOIN votes v 
     ON v.post_id = p.id 
    ORDER BY 
     SUM(CASE WHEN v.postid IS NOT NULL THEN 1 ELSE 0 END) DESC 
    GROUP 
    BY p.id 

필요합니다 할 수 있습니다 COUNT (NULL) = 1이기 때문에 여기에

구조가 너무 가까워서 여기 an example에서 볼 수 있습니다 .SE

관련 문제