2011-04-13 5 views
1

기본적으로 사용자가 팁, 설명 및 투표의 3 가지 정보를 입력 할 수있는 시스템이 있습니다. 이러한 정보는 3 개의 다른 테이블에 저장됩니다. 각 테이블의 연결 열은 사용자 ID입니다. 사용자가 세 가지 유형 중 하나의 정보를 전혀 가지고 있는지 확인하기 위해 쿼리를 수행하려고합니다. 하나의 쿼리에서이 작업을 수행하려고 시도하지만 완전히 잘못되었습니다. 여기에 내가 지금 함께 일하고 있어요 무엇 :이 투표이나 의견이 지정된 USER_ID에 의해 만들어진되지 않은 경우에도, 많은 투표를 위해 복제 만 팁을 받고있는 것 같다 또는 거기에 코멘트동일한 열이있는 여러 테이블의 결과 계산

SELECT DISTINCT 
    * 
    FROM tips T 
    LEFT JOIN comments C ON T.user_id = C.user_id 
    LEFT JOIN votes V ON T.user_id = V.user_id 
    WHERE T.user_id = 1 

.

각 유형의 개별 개수가 아니라 하나의 숫자 만 필요합니다. 기본적으로 user_id 아래에 팁, 설명 및 득표 수의 합이 필요하지만 세 가지 쿼리를 수행하고 싶지 않습니다.

누구든지 아이디어가 있습니까?

편집 : 실제로 기술적으로 실제 계산할 필요는 없습니다. user_id가있는 세 테이블 중 하나에 행이 있는지 알아야합니다.

편집 2 : 나는 거의이 함께 있습니다

SELECT 
    COUNT(DISTINCT T.tip_id), 
    COUNT(DISTINCT C.tip_id), 
    COUNT(DISTINCT V.tip_id) 
    FROM tips T 
    LEFT JOIN comments C ON T.user_id = C.user_id 
    LEFT JOIN votes V ON T.user_id = V.user_id 
    WHERE T.user_id = 1 

나는 USER_ID 1 테스트있어 (나). 나는 11 개의 팁을 만들었고 4 번 투표했으며 아무런 코멘트도 남기지 않았습니다. 내 반환은 3 열 : 11, 0, 4 행입니다. 적절한 계산입니다. 그러나 팁이나 설명을 작성하지 않은 사용자를 대상으로 테스트했지만 3 회 투표를 통해 모든 카운트에서 0을 반환하면 0, 0, 3이 반환됩니다.

'나는 그 WHERE 절을 사용하고있는 테이블에 user_id의 행이 없으면 다른 테이블에 해당 user_id 행이 있더라도 보드 전체에서 0을 얻는 것 같습니다. 나는이 쿼리를 사용할 수 있습니다 :

SELECT 
    (SELECT COUNT(*) FROM tips WHERE user_id = 2) + 
    (SELECT COUNT(*) FROM comments WHERE user_id = 2) + 
    (SELECT COUNT(*) FROM votes WHERE user_id = 2) AS total 

그러나 저는 이것들이 서브 쿼리 일지라도 다수의 쿼리를 실행하는 것을 피하고 싶었습니다.

UPDATE 에이스

덕분에, 나는이 알아 낸 :

SELECT 
    (COUNT(DISTINCT T.tip_id) + COUNT(DISTINCT C.tip_id) + COUNT(DISTINCT V.tip_id)) AS total 
    FROM users U 
    LEFT JOIN tips T ON U.user_id = T.user_id 
    LEFT JOIN votes V ON U.user_id = V.user_id 
    LEFT JOIN comments C ON U.user_id = C.user_id 
    WHERE U.user_id = 4 

사용자 테이블이 분명히 포함하여 사용자, 사용자 ID의 한판 승부 실제 정보가 포함되어 있습니다. 내가 다른 테이블에 없었더라도 사용자가 해당 테이블에 존재할 것이라는 것을 100 % 확신 할 수 있기 때문에 부모로 user 테이블을 사용했습니다. 나는이 쿼리로 원했던 적절한 수를 얻었다.

+0

데이터베이스 디자인이 합리적이지 않은지 잘 모르겠습니다. 어쩌면 그럴 수도 있지만 보이지는 않습니다. –

+0

그것은 완벽합니다. 사용자는 챌린지에 대한 팁을 게시합니다. 이 팁은 "팁"테이블로 보내지고 다른 것들 중에서 포스터의 user_id가 포함됩니다. 다른 사용자는 해당 팁에 주석을 달 수 있으며, 그 주석은 "주석"테이블로 전송되며 user_id도 포함됩니다. 마지막으로, 사용자는 팁에 투표 할 수 있으며, "votes"테이블에 저장되며 user_id도 포함됩니다. 이것이이를 수행하고 누가 어떤 게시물을 게시했는지 추적 할 수있는 유일한 방법입니다. 사용자가 투표를했는지 또는 팁이나 코멘트를 게시했는지 확인해야 표시 이름을 변경하는 것을 허용하거나 거부 할 수 있습니다. – HaLo2FrEeEk

+0

0,0,3이 아닌 0,0,0을 얻는 이유는 기본 테이블이 user_id가없는 'tips'이고 user_id로'votes'가있는 'LEFT JOIN'입니다. 처음에는 모든 행이'tips'에서 얻을 것이고, 그러면'LEFT JOIN'을 다른 테이블과 함께 사용하면됩니다. MySql은'votes'에 포함 된 모든 user_id를 찾아서 결합합니다. 'LEFT table or tips'에없는 user_id는'votes'에서 제외되므로'vote'에 user_id를 넣지 않을 것입니다. 또한 열의 모든 동일한 값의 결과가 1로 계산되기 때문에 DISTINCT를 사용하여 문제가 발생합니다. – ace

답변

1

나는 당신의 질문을 이해합니다. 각 사용자의 총 댓글 수 + 도움말 + 득표 수를 계산하려고합니다. 아래 질문을 한 번 살펴 보도록하겠습니다. 다른 사람이 나를 가르쳐 줄 때 크로스 탭 쿼리에 대한 세부 정보 열을 추가했습니다.

EDITED QUERY :

SELECT 
     COALESCE(COALESCE(t2.tips,0) + COALESCE(c2.comments,0) + COALESCE(v2.votes,0)) AS `Totals` 
    FROM parent p 
    LEFT JOIN (SELECT t.user_id, COUNT(t.tip_id) AS tips FROM tips t GROUP BY t.user_id) t2 
     ON p.user_id = t2.user_id 
    LEFT JOIN (SELECT c.user_id, COUNT(c.tip_id) AS comments FROM comments c GROUP BY c.user_id) c2 
     ON p.user_id = c2.user_id    
    LEFT JOIN (SELECT v.user_id, COUNT(v.tip_id) AS votes FROM votes v GROUP BY v.user_id) v2 
     ON p.user_id = v2.user_id 
    WHERE p.user_id = 1; 

참고 :이 다른 테이블에없는 테이블의 결과를 얻기 위해 부모 테이블을 사용했다.

내 JOIN에서 하위 쿼리를 사용하는 이유는 각 테이블에 대한 tip_id의 합계를 얻을 가상 테이블을 만드는 것입니다. 또한 DISTINCT에 대한 동일한 쿼리를 사용하여 문제가 발생하므로이 쿼리로 끝납니다.

하위 쿼리를 사용하지 않는 것이 좋지만 하위 쿼리 없이는 실패했습니다. 당분간 이것은 할 수있는 모든 것입니다.

+0

사용자가 팁을 주거나 게시했는지 알아야합니다. 그 중 하나라도 사실이면 카운트가 0보다 커야합니다. 첫 번째 게시물의 편집을 확인하십시오. 주석과 득표는 팁 자체에 링크되어 있기 때문에 user_id와 tip_id의 세 테이블 모두에서 두 개의 열이 있습니다. 기본적으로 3 개의 테이블 중 하나에 user_id = #가 들어있는 행이 포함 된 경우 0보다 큰 숫자를 가져야합니다. 테이블에 user_id = #가있는 행이 없으면 0이되어야합니다. – HaLo2FrEeEk

+0

원하는 결과가 표시됩니다. 필드 이름을 쿼리의 필드 이름과 함께 편집하여 ID WHERE 절을 추가 할 것입니다. 여전히 당신이 원하는 것이 아니라면, 시간이 있다면 새로운 쿼리를 만들려고 노력할 것입니다. – ace

+0

죄송하지만 귀하의 질문을 전혀 이해하지 못합니다. FROM 절에서 SELECT의 목적은 무엇입니까? 테이블을 원하는 절로 행을 선택합니다. 내가 그것을 실행하려고 할 때 나는 모든 종류의 오류를 얻는다. 나는 단지 하나의 숫자 만 필요로한다. 이 숫자는 지정된 user_id가 작성한 팁, 설명 및 득표 수의 합계가됩니다. 사용자가 팁 1 개, 댓글 2 개, 투표 2 개를 작성한 경우 카운트는 3이됩니다. 팁 5 개, 코멘트 2 개, 투표하지 않은 경우 카운트는 7이됩니다. – HaLo2FrEeEk

관련 문제