Dies ist nicht die eleganteste Lösung, aber wenn Sie nicht die Tabellenstruktur Sie Entpivotisierung die Daten können dann ändern können, und dann einen Benutzer definierten Variablen gelten für jede STUDENT_ID eine Zeilennummer zu erhalten. Der Code wird ähnlich der folgenden sein:
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;
SQL Fiddle with Demo See. Dies ergibt die oberen 2 Markierungen pro student_id
. Die innere Unterabfrage führt eine ähnliche Funktion aus wie die Verwendung eines UNION ALL zum Entsperren, aber Sie werden nicht mehrmals mit der Tabelle abgefragt, um das Ergebnis zu erhalten.
Was Ihre Tabellenstruktur ist – Jake1164
@ Jake1164 Abfrage so ziemlich alles erklärt. – BlitZ
http://stackoverflow.com/questions/5360894/get-the-second-highest-value-in-a-mysql-table –