2016-07-02 2 views
0

BY GROUP과 함께 조건 나는 두 테이블중복 COUNT는

게임

+--------+-------------+----------------+----------------+ 
| gameID | challengeID | player1_userID | player2_userID | 
+--------+-------------+----------------+----------------+ 
|  1 |   1 |    1 |    2 | 
|  2 |   1 |    1 |    3 | 
|  3 |   2 |    1 |    4 | 
+--------+-------------+----------------+----------------+ 

+-------------+---------+ 
| challengeID | content | 
+-------------+---------+ 
|   1 | one  | 
|   2 | two  | 
|   3 | three | 
+-------------+---------+ 

도전 그리고 난에 출력을 원하는 다음 한 조인과 아래와 같이하십시오. 기본적으로 사용자 (예 : userID = 1)는 모든 챌린지 데이터를 각 챌린지와 비교하여 재생되는 게임의 수와 함께 요청하며 해당 챌린지가 요청한 사용자에 의해 재생되었는지 여부에 대한 정보도 필요합니다.

출력

+-------------+---------+---------+---------------------+ 
| challengeID | content | n_games | played_by_requestor | 
+-------------+---------+---------+---------------------+ 
|   1 | one  |  2 | TRUE    | 
|   2 | two  |  1 | TRUE    | 
|   3 | three |  0 | FALSE    | 
+-------------+---------+---------+---------------------+ 

(아이디 = 1)이 믿을 수 없 단순하게 등장하지만 지난 4시간 (지금 오전 1시 35분입니다) 그리고 최선을 노력했습니다 나는 아래의 코드를 얻을 수 있었다.

SET @myID = 1; 
SELECT 
    COUNT(g1.challengeID) as n_games, 
    CASE 
     WHEN g.gameID IS NULL THEN FALSE ELSE TRUE 
    END AS played_by_requestor, 
    c.* 
FROM challenges c 
LEFT JOIN games g 
    ON c.challengeID = g.challengeID AND 
     (player1_userID = @myID or player2_userID = @myID) 
LEFT JOIN games g1 
    ON c.challengeID = g1.challengeID 
GROUP BY c.challengeID; 

하지만 잘못된 결과가 나타납니다. 요청자의 사용자 ID = 1의 경우,이 코드는 n_games을 제공 challengeID = 1 = 4도 challengeID = 2

SQL Fiddle here

감사를 위해 = 1 n_games.

+0

'게임'에 두 번째로 참여하는 이유를 알 수 없습니다. 이것은 중복 레코드의 제조법입니다. – siride

+0

'n_games'를 얻으려면 한 번,'plays_by_requestor'를 얻으려면 두 번째로 –

+0

단일 참여에서 두 통계를 모두 얻을 수 있습니다. 당신이 가진 참여는 당신이 원하는 것을하지 않습니다. 대신 @myID가 도전 과제의 플레이어 중 하나인지 CASE 표현식에 질문하고 첫 번째 LEFT JOIN에서 해당 논리를 제거하십시오. – siride

답변

1

마지막으로 작동하도록했습니다! (예를 들어, 두 games 테이블에 조인 사용하지 않고) 더 우아한 해결책이있는 경우

SET @myID = 3; 
SELECT 
    COUNT(g.challengeID) AS n_games, 
    CASE 
     WHEN uC.p_challengeID IS NULL THEN FALSE ELSE TRUE 
    END AS played_by_requestor, 
    c.* 
FROM challenges c 
LEFT JOIN games g 
    ON (c.challengeID = g.challengeID) 
LEFT JOIN 
    (SELECT g1.challengeID AS p_challengeID 
    FROM games g1 
    WHERE (player1_userID = @myID OR player2_userID = @myID) 
    GROUP BY g1.challengeID) uC 
ON c.challengeID = uC.p_challengeID 
GROUP BY c.challengeID; 

, 나는 기꺼이 대답으로 그것을 받아 들일 것이다.

+1

http://sqlfiddle.com/#!9/d232d/2 – splash58

+0

sqlfiddle.com/#!9/d232d/2에서 @ splash58, 'plays_by_requestor'는 @myID = 4에 대해서도 두 가지 도전 과제 모두 1입니다. 잘못된 것입니다. –

+0

'not (sum()) '사업은 용의주합니다. 'MAX (IF (@MyID IN (g.player1_UserID, g.player2_UserID), 1, 0))'와 같은 간단한 것을 할 것입니다. – siride