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
감사를 위해 = 1 n_games.
'게임'에 두 번째로 참여하는 이유를 알 수 없습니다. 이것은 중복 레코드의 제조법입니다. – siride
'n_games'를 얻으려면 한 번,'plays_by_requestor'를 얻으려면 두 번째로 –
단일 참여에서 두 통계를 모두 얻을 수 있습니다. 당신이 가진 참여는 당신이 원하는 것을하지 않습니다. 대신 @myID가 도전 과제의 플레이어 중 하나인지 CASE 표현식에 질문하고 첫 번째 LEFT JOIN에서 해당 논리를 제거하십시오. – siride