Wir können GREATEST verwenden, um den größten Nutzen aus mehreren Spalten zu ziehen wie unten
%Vor%Aber jetzt möchte ich von allen (5) Noten zwei Bestnoten bekommen.
Kann ich das für die mysql-Abfrage tun?
Tabellenstruktur (ich weiß, dass es falsch ist - von jemandem erstellt):
%Vor%Dies ist nicht die eleganteste Lösung, aber wenn Sie die Tabellenstruktur nicht ändern können, können Sie die Daten pivot und dann eine benutzerdefinierte Variable anwenden, um eine Zeilennummer für jede student_id zu erhalten. Der Code wird dem folgenden ähneln:
%Vor% Siehe SQL Geige mit Demo . Dies liefert die besten 2 Punkte 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.
Ich denke, Sie sollten Ihre Datenbankstruktur ändern, weil das viele horizontale Markierungen (d. h. als Felder / Spalten) bedeutet, dass Sie etwas falsch machen.
Platzieren Sie stattdessen alle Ihre Marken in einer separaten Tabelle, in der Sie eine Viele-zu-Viele-Beziehung erstellen und dann die erforderliche SELECT
zusammen mit LIMIT
ausführen.
Vorschläge:
mark_types
aufrufen. Spalten: id
, mark_type
. ich
sehen Sie, dass Sie derzeit 5 Arten von Marken haben; es wäre sehr einfach
um weitere Typen hinzuzufügen. marks
so, dass sie 3 Spalten enthält: id
,
mark
/ grade
/ value
, mark_type
(diese Spalte Fremdeinschränkungen für
mark_types
). SELECT
-Abfrage mit Hilfe von Joins und GROUP BY mark_type
. Sie können eine temporäre Tabelle erstellen und dann
Erstellen Sie eine temporäre Tabelle in einer SELECT-Anweisung ohne eine separate CREATE TABLE
Abfrage diese Tabelle wie folgt
SELECT TOP 2 * VON temp ORDER BY Markierung DESC
dann
Drop Temp Tabelle