DROP TABLE IF EXISTS scores;
CREATE TABLE scores(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,user CHAR(1) NOT NULL,score INT NOT NULL,INDEX(user,score));
INSERT INTO scores (user,score)
VALUES
('X',50),
('Y',74),
('X',9),
('X',12),
('Y',21);
SELECT x.*
FROM scores x
JOIN scores y
ON y.user = x.user
AND y.score >= x.score
GROUP
BY x.user
, x.score
HAVING COUNT(*) = 2
ORDER
BY score DESC
LIMIT 1;
+----+------+-------+
| id | user | score |
+----+------+-------+
| 5 | Y | 21 |
+----+------+-------+
같은 사용자가 당신은 어딘가에서 DISTINCT를 포함해야합니다, 두 번 같은 점수를 가질 수있는 기회가 있다면 -하지만 난 독자들에게 운동으로 떠날거야가.
성능이 문제가되면 다음과 유사한 솔루션이 훨씬 더 확장 가능합니다. 나는 여러 변수를 추적 할 때 뒤죽박죽이되는 습관을 가지고 있기 때문에 나는 ... '유사'라고 두 명의 사용자와 약의 색인 테이블에
SELECT id,user,score
FROM
(
SELECT id
, user
, score
, @puser := @cuser
, @prev := @curr
, @cuser := user
, @curr := score
, @rank := IF(@puser = @cuser,IF(@prev = @curr, @rank, @rank+1),@rank:=1) rank
FROM scores
JOIN (SELECT @cuser :=null,@puser := null,@curr := null, @prev := null, @rank := 0) sel1
ORDER
BY user, score DESC
) x
WHERE rank = 2
ORDER BY score DESC LIMIT 1;
+----+------+-------+
| id | user | score |
+----+------+-------+
| 5 | Y | 21 |
+----+------+-------+
빠른 테스트 10,000 행. 쿼리 1은 15 초 만에 완료되고 쿼리 2는 1/100 초 만에 완료됩니다!
'두 번째 최대 점수'를 더 잘 정의하십시오. – AmazingDreams
LIMIT 1,1과 GROUP BY를 결합하려고했습니다. 그러나 그것은 작동하지 않습니다. –
'OFFSET 1 LIMIT 1' 시도해 봤어? – AmazingDreams