2011-11-03 5 views
0

현재 간단한 (?) SQL 쿼리를 만들려고 노력 중입니다. 이 아니지만 SELECT post.id, <positive count>, <negative count> ...게시물 당 투표 수를 계산하십시오.

: 우리는 각 게시물에 대한 긍정과 부정 투표 수를 반환하는 선택을 구축을 위해 노력하고

create table `post` (
    `id` integer primary key 
) 
create table `vote` (
    `id` integer primary key, 
    `post_id` references `post`.`id`, // Well ok, it's a foreign key then... 
    `value` int // 1 for a positive vote, or zero for a negative one 
) 

:

우리는이 두 테이블이 하위 선택을하기가 어려우므로 하위 선택없이이 작업을 시도 할 때 도전이 시작됩니다 (join). 우리는 left outer join을 사용하고 있으며 게시물에 긍정적이거나 부정적인 투표 만있을 때 문제가 발생합니다.

문제를 이해하는 동안 join으로 만 수행하는 방법을 알아낼 수는 없지만 하위 선택없이 수행 할 수 있다고 확신합니다. 어떻게 그럴 수 있니?

+0

어떤 서버를 사용하고 있습니까? – sll

+0

MySQL 5 실행하기 – aspyct

답변

0

이전 대답은 내가 GROUP에 잊고, 쓰레기했다 (이 ... 잘못된 방향으로 당신을 안내하지 않도록 글쎄, 난, 내 현재 쿼리를 포함하지 않았다). 여기에 CASE를 사용하는 대안이다, 나는 (NULL 될 것 WHEN 절 이후)에 NULL 사건을 처리하는 것 같지만 결국 COALESCE을 사용해야 할 수도 있습니다 ... :

SELECT post.id, SUM(CASE WHEN a.vote > 0 THEN 1 ELSE 0 END) up, SUM(CASE WHEN a.vote < 0 THEN 1 ELSE 0 END) down FROM post LEFT JOIN vote a ON (a.post_id = post.id) GROUP BY post.id 

이전 (잘못된) 대답 :

그것은 당신이 NULL 제로에 강제로 COALESCE를 사용할 필요가 같은 소리 - 작동 할 수 있습니다 다음을하지만 검증되지 않은 것입니다 :

SELECT post.id, SUM(COALESCE(a.vote,0)), SUM(COALESCE(b.vote,0)) FROM post LEFT JOIN vote a ON (a.post_id = post.id AND value > 0) LEFT JOIN vote b ON (b.post_id = post.id AND value < 0) 
+0

오, 나는 "복잡한"조인 criterias를 만들 수 있는지 몰랐다. 나는 항상 간단한 "xx.yy_id = yy.id"를 사용했다. 글쎄 이것은 누락 된 부분이었고 오랫동안 그것을 놓쳤습니다! 대단히 감사합니다 (우리 둘로부터;)) – aspyct

관련 문제