나는 그룹당 가장 큰 문제에 대한 간단한 확장을 가지고 있습니다.
내 질문은 다음과 같습니다.
$q =
'SELECT
played.words, MAX(played.score) max_score, played.longest, played.game_options,
users.first_name
FROM played
INNER JOIN users
ON played.user_id = users.user_id
GROUP BY game_options
';
불행히도 주어진 game_options에 대해 항상 최대 점수를 얻지 만 user.first_name은 일반적으로 잘못되었습니다 (예 : 동일한 game_options 값의 경우 Tom이 먼저 플레이하고 63을 얻었고 Joe가 2 위를하고 100을 얻었습니다. Joe 대신, Tom은 Joe의 높은 점수와 함께 반환됩니다.)
일종의 내부 조인이 필요하다고 가정하지만 두 테이블 (사용자 테이블 및 게임 플레이 테이블)과 관련된 내부 조인이 이미 있기 때문에 알아낼 수 없습니다. 나는 이것이 중복 된 질문이라고 상상해야하는데 그것을 찾을 수 없었다. 도움을 주셔서 감사합니다.
모든 동점 결과를 표시하는 한 가지 방법 :
SELECT
p.words,
p.score AS max_score,
p.longest,
p.game_options,
u.first_name,
m.cnt AS game_played_count
FROM played AS p
INNER JOIN users AS u
ON p.user_id = u.user_id
INNER JOIN
( SELECT
pp.game_options,
MAX(pp.score) AS score,
COUNT(*) AS cnt
FROM played AS pp
GROUP BY pp.game_options
) AS m
ON m.game_options = p.game_options
AND m.score = p.score ;
사전 정의 된 순서에 따라 결정된 동점 :
SELECT
p.words,
p.score AS max_score,
p.longest,
p.game_options,
u.first_name,
dp.cnt AS game_played_count
FROM
( SELECT game_options,
COUNT(*) AS cnt
FROM played
GROUP BY game_options
) AS dp
INNER JOIN played AS p
ON p.play_id = -- assuming that `play_id` is the PK
( SELECT pi.play_id
FROM played AS pi
WHERE pi.game_options = dp.game_options
ORDER BY pi.score DESC, -- the predefined
pi.play_id ASC -- order
LIMIT 1
)
INNER JOIN users AS u
ON p.user_id = u.user_id ;
인덱스 (game_options, score, play_id)
는 두 쿼리 모두에서 효율성 에 도움이됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다