To nie jest najbardziej eleganckie rozwiązanie, ale jeśli nie może zmienić strukturę tabeli następnie można UNPIVOT dane, a następnie zastosować zmiennej zdefiniowanej przez użytkownika, aby uzyskać numer wiersza dla każdego student_id. Kod będzie podobny do następującego:
select student_id, name, col, data
from
(
SELECT student_id, name, col,
data,
@rn:=case when student_id = @prev then @rn else 0 end +1 rn,
@prev:=student_id
FROM
(
SELECT student_id, name, col,
@rn,
@prev,
CASE s.col
WHEN 'mark1' THEN mark1
WHEN 'mark2' THEN mark2
WHEN 'mark3' THEN mark3
WHEN 'mark4' THEN mark4
WHEN 'mark5' THEN mark5
END AS DATA
FROM marks
CROSS JOIN
(
SELECT 'mark1' AS col UNION ALL
SELECT 'mark2' UNION ALL
SELECT 'mark3' UNION ALL
SELECT 'mark4' UNION ALL
SELECT 'mark5'
) s
cross join (select @rn := 0, @prev:=0) c
) s
order by student_id, data desc
) d
where rn <= 2
order by student_id, data desc;
Zobacz SQL Fiddle with Demo. Spowoduje to zwrócenie 2 najlepszych znaków za student_id
. Podzapytanie wewnętrzne wykonuje podobną funkcję, jak użycie UNIONA WSZYSTKIEGO do rozpakowania, ale nie dostajesz zapytania o tabelę wiele razy, aby uzyskać wynik.
Jaki jest Twój struktury tabeli – Jake1164
@ Jake1164 zapytania wyjaśnia prawie wszystko. – BlitZ
http://stackoverflow.com/questions/5360894/get-the-second-highest-value-in-a-mysql-table –