Рассмотрим следующее, которое еще более обобщенно обобщается:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL
,score_no INT NOT NULL
,score INT NOT NULL
,PRIMARY KEY(id,score_no)
);
INSERT INTO my_table VALUES
(1, 1 ,10),
(1 ,2 ,05),
(1 ,3 ,30),
(1 ,4 ,50),
(2 ,1 ,05),
(2 ,2 ,15),
(2 ,3 ,10),
(2 ,4 ,00),
(3 ,1 ,25),
(3 ,2 ,10),
(3 ,3 ,05),
(3 ,4 ,15);
SELECT id
, score_no
, score
FROM
( SELECT x.*
, CASE WHEN @prev=id THEN @i:=@i+1 ELSE @i:=1 END rank
, @prev:=id
FROM my_table x
, (SELECT @prev:=null,@i:=0) vars
ORDER
BY id
, score DESC
, score_no
) a
WHERE rank = 2;
+----+----------+-------+
| id | score_no | score |
+----+----------+-------+
| 1 | 3 | 30 |
| 2 | 3 | 10 |
| 3 | 4 | 15 |
+----+----------+-------+
В случае привязанных оценок это решение выбирает решение с меньшим значением "score_no".