mysql - Ermittelt die zwei größten Werte aus mehreren Spalten

8

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%     
LoganPHP 21.05.2013, 11:17
quelle

4 Antworten

2

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.

    
Taryn 21.05.2013, 11:35
quelle
2

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:

  1. Erstellen Sie eine Tabelle, die Sie 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.
  2. Ändern Sie Ihre Tabelle marks so, dass sie 3 Spalten enthält: id , mark / grade / value , mark_type (diese Spalte Fremdeinschränkungen für mark_types ).
  3. Schreiben Sie Ihre SELECT -Abfrage mit Hilfe von Joins und GROUP BY mark_type .
silkfire 21.05.2013 11:23
quelle
0

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

    
ajt 21.05.2013 11:40
quelle
0

Okay, hier ist eine neue Antwort, die mit der aktuellen Tabellenstruktur funktionieren sollte:

%Vor%     
silkfire 21.05.2013 11:43
quelle

Tags und Links