2011-08-05 7 views
0

이상한 질문이 있습니다. 각 사용자마다 고유 한 사용자 ID가있는 사용자 테이블이 있습니다. 사용자는 다른 테이블에 저장된 주석 (팁)을 게시 할 수 있으며 각 주석 행에는 고유 한 ID가 있으며 게시 된 사용자의 사용자 ID도 포함됩니다. 마지막으로 다른 사용자가 의견에 투표 할 수 있습니다. 투표는 투표 한 사람의 사용자 ID와 투표 된 메모의 메모 ID (고유 ID 없음)와 함께 다른 표에 저장됩니다.LEFT JOIN이있는 이상한 MySQL 동작

나는 투표 수를 득표 수에서 득표 수를 뺀 숫자로 계산하므로 4 위 및 2 위는 2의 평가를 얻습니다. 사람의 등급에 따라 분류 할 수있는 회원 목록을 갖고 싶지만 약간의 문제가 있습니다. 내가 쿼리에 하나의 사용자 ID를 제공 할 때 작동

(COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE NULL END)) AS 'rating', 

, WHERE 절, WHERE USER_ID = 1 :

나는 위 표 아래의 수를 결정하는 COUNT() 및 CASE를 사용 그러나 모든 회원과 등급에 대한 목록을 얻고 싶습니다. 문제가 발생하는 곳입니다. 내 쿼리 : 기본적으로

SELECT DISTINCT 
    U.user_id, 
    (COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE NULL END)) AS 'rating', 
    username 
    FROM users U 
    LEFT JOIN tips T ON U.user_id = T.user_id 
    LEFT JOIN votes V ON T.tip_id = V.tip_id 

는, 이것은 tip_id가 팁에 tip_id 테이블로 동일한 투표의 모든 행을 찾아야한다은 다음 USER_ID는 팁의 모든 행 테이블입니다 사용자 테이블의 user_id와 같습니다. 내가 겪고있는 문제는 사용자 테이블에 83 개의 행이 있더라도 하나의 행만 반환된다는 것입니다. 투표 테이블에는 287 개의 행과 257 개의 투표 및 30 개의 아래쪽 투표가 있습니다. 내가 얻는이 단일 행은 227 (257-30) 등급을 가지며, 이는 내가 찾고있는 특정 user_id에 대한 것이 아닌, 투표 테이블의 모든 행이 계산되고 있음을 의미합니다. 각 사용자가 자신의 모든 팁에 대해 얻은 상향 및 하향 투표 수를 얻고 싶습니다.

기본적으로 users 테이블의 모든 user_id에 대해 해당 사용자 ID에 대한 모든 tip_id를 찾은 다음 해당 tip_id에 대해 모두 투표해야합니다.

이것이 가능하지 않습니까? 아니면 끔찍한 뭔가를 놓치고 있습니까?

편집 : COUNT() 줄을 완전히 제거하면 쿼리가 작동하고 적절한 수의 행이 반환됩니다. 투표 정보가 없습니다.

답변

0
SELECT 
    U.user_id, 
    (COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE  NULL END)) AS 'rating', 
username 
FROM users U 
    LEFT JOIN tips T ON U.user_id = T.user_id 
    LEFT JOIN votes V ON T.tip_id = V.tip_id 
GROUP BY U.user_id, rating, username 

나는 테스트하지 않았다. 하지만 당신이 그룹 조항을 빠뜨린 것 같아요.

+0

그래서 뭔가 어리석은 것이 분명했습니다. 전에 이런 문제가 있었지만 어디서나 코드를 찾을 수 없었습니다. 방금 GROUP BY U.user_id를 추가했습니다. 감사합니다. (수락) – HaLo2FrEeEk

+0

: D 도와 줘서 기쁩니다. – Jaxedin