2013-05-03 1 views
1

많은 LEFT JOINS가 포함 된 매우 긴 쿼리가 있습니다. 문제는 함께 작동하지 않는 두 개의 COUNT가 있다는 것입니다. 두 카운트가 같지 않더라도 두 카운트 모두 같은 값이됩니다.왼쪽 결합은 서로 다른 테이블에서 두 개의 값을 같은 값으로 만듭니다.

다음은 내가 가지고있는 것입니다.

SELECT T.ID, 
     T.name, 
     T.pic, 
     T.T_ID, 
     COUNT(P.T_ID) AS plays, 
     COUNT(L.T_ID) AS likes, 
     S.Status, 
     G.gig_name, 
     G.date_time, 
     G.lineup, 
     G.price, 
     G.ticket, 
     E.action, 
     E.ID, 
     E.timestamp, 
     E.E_ID 
    FROM events E 
     LEFT JOIN TRACKS T 
     ON T.ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T.T_ID 
     LEFT JOIN STATUS S 
     ON S.ID = E.ID AND E.action = 'has some news.' AND E.E_ID = S.S_ID 
     LEFT JOIN GIGS G 
     ON G.ID = E.ID AND E.action = 'has posted a gig.' AND E.E_ID = G.G_ID 
     LEFT JOIN track_plays P 
     ON P.A_ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = P.T_ID 
     LEFT JOIN track_likes L 
     ON L.ID = E.E_ID AND E.action = 'has uploaded a track.' 
WHERE E.ID = '3' 
GROUP BY E.E_ID 
ORDER BY E.timestamp DESC LIMIT 15 

나는 모든 쿼리를 설명하지는 않겠지 만, 당신은 그 요점을 알게 될 것입니다. 문제의 JOINS는 마지막 두 가지입니다. COUNT(P.T_ID) = 100COUNT(L.T_ID)도 = 100입니다.

미리 감사드립니다.

답변

1

를 사용하여 시도해야합니다 :

SELECT T.ID, 
     T.name, 
     T.pic, 
     T.T_ID, 
     (SELECT COUNT(*) FROM track_plays WHERE A_ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T_ID) AS plays, 
     (SELECT COUNT(*) FROM track_likes WHERE ID = E.E_ID AND E.action = 'has uploaded a track.') AS likes, 
     S.Status, 
     G.gig_name, 
     G.date_time, 
     G.lineup, 
     G.price, 
     G.ticket, 
     E.action, 
     E.ID, 
     E.timestamp, 
     E.E_ID 
    FROM events E 
     LEFT JOIN TRACKS T 
     ON T.ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T.T_ID 
     LEFT JOIN STATUS S 
     ON S.ID = E.ID AND E.action = 'has some news.' AND E.E_ID = S.S_ID 
     LEFT JOIN GIGS G 
     ON G.ID = E.ID AND E.action = 'has posted a gig.' AND E.E_ID = G.G_ID 
WHERE E.ID = '3' 
GROUP BY E.E_ID 
ORDER BY E.timestamp DESC LIMIT 15 

내가이 종종 빠르게 유지하고/이해하는 것이 더 간단 할 찾을 수 있습니다.

0

두 COUNT에는 WHERE 절이 없으며 같은 테이블, 즉 결과 테이블에 나타납니다. 따라서 두 테이블 모두 결과 테이블의 전체 행 수를보고합니다.

+0

처럼 될 수를 변경해야 할 수 있습니다. LEFT JOINS에 대한 올바른 구문은 –

+0

입니다. 나는 WHERE 절이 없다는 의미였습니다. 이 부분의 마지막 부분은 완전한 결과 집합을 나타내므로 모든 행의 수를 나타내는 두 개의 COUNT 모두에서 개수와 결과가 동일합니다. –

1

당신은 당신이 상관 하위 쿼리로 그 수를 "문구를 수정"시도 할 수 있습니다 COUNT(DISTINCT)

SELECT T.ID, 
     T.name, 
     T.pic, 
     T.T_ID, 
     COUNT(DISTINCT P.T_ID) AS plays, 
     COUNT(DISTINCT L.T_ID) AS likes, 
     S.Status, 
     G.gig_name, 
     G.date_time, 
     G.lineup, 
     G.price, 
     G.ticket, 
     E.action, 
     E.ID, 
     E.timestamp, 
     E.E_ID 
    FROM events E 
     LEFT JOIN TRACKS T 
     ON T.ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = T.T_ID 
     LEFT JOIN STATUS S 
     ON S.ID = E.ID AND E.action = 'has some news.' AND E.E_ID = S.S_ID 
     LEFT JOIN GIGS G 
     ON G.ID = E.ID AND E.action = 'has posted a gig.' AND E.E_ID = G.G_ID 
     LEFT JOIN track_plays P 
     ON P.A_ID = E.ID AND E.action = 'has uploaded a track.' AND E.E_ID = P.T_ID 
     LEFT JOIN track_likes L 
     ON L.ID = E.E_ID AND E.action = 'has uploaded a track.' 
WHERE E.ID = '3' 
GROUP BY E.E_ID 
ORDER BY E.timestamp DESC LIMIT 15 
+0

정상적인 카운트를 가지고 있고 매력적으로 다른 카운트와 구별되는 카운트! –

+0

스 카치, 과거 1처럼 작동하지 않습니다. 아래 답변은 완벽하게 작동합니다! –

+0

나는 내부 쿼리가 더 깨끗한 솔루션처럼 보인다고 동의합니다. –

0

내가 잘못 생각한 것일 수도 있지만, 당신은 thevresult 행 중 #을 셀 수 있습니다. 그렇지 않습니까?

당신이 모든 조인 후 절에 나타나는 WHERE 보면

select count(P_ID) from track_plays where p_id = E.ID

관련 문제