2010-03-19 9 views
7

Wie behandelt man Verbindungen, wenn das Ranking eine mysql-Abfrage ergibt? Ich habe die Tabellennamen und Spalten in diesem Beispiel vereinfacht, aber es sollte mein Problem veranschaulichen:Wie gehe ich mit Schlüssen um, wenn ich die Ergebnisse in MySQL bewerte?

SET @rank=0; 

    SELECT student_names.students, 
      @rank := @rank +1 AS rank, 
      scores.grades 
    FROM student_names 
LEFT JOIN scores ON student_names.students = scores.students 
ORDER BY scores.grades DESC 

So vorstellen, die die obige Abfrage erzeugt:

Students Rank Grades 
======================= 
Al   1  90 
Amy  2  90 
George  3  78 
Bob  4  73 
Mary  5  NULL 
William 6  NULL 

Obwohl Al und Amy haben die gleiche Klasse, einer ist höher als der andere. Amy wurde abgerissen. Wie kann ich es so machen, dass Amy und Al die gleiche Rangfolge haben, so dass sie beide den Rang 1 haben. Auch William und Mary haben den Test nicht gemacht. Sie nahmen Unterricht und rauchten im Zimmer des Jungen. Sie sollten für den letzten Platz gebunden sein.

Das sollte korrekt Ranking sein:

Students Rank Grades 
======================== 
Al   1  90 
Amy  1  90 
George  2  78 
Bob  3  73 
Mary  4  NULL 
William 4  NULL 

Wenn jemand einen Rat hat, lassen Sie es mich wissen.

Antwort

16

EDIT: Dies ist MySQL 4.1 und höher unterstützt

Verwendung:

SELECT st.name, 
      sc.grades, 
      CASE 
      WHEN @grade = COALESCE(sc.grades, 0) THEN @rownum 
      ELSE @rownum := @rownum + 1 
      END AS rank, 
      @grade := COALESCE(sc.grades, 0) 
    FROM STUDENTS st 
LEFT JOIN SCORES sc ON sc.student_id = st.id 
    JOIN (SELECT @rownum := 0, @grade := NULL) r 
ORDER BY sc.grades DESC 

Sie eine Cross-Join (in MySQL, ein INNER JOIN ohne Kriterien) verwenden können, um eine Variable zu deklarieren und verwenden ohne eine separate SET Anweisung zu verwenden.

Sie benötigen die COALESCE, um die NULLs richtig zu behandeln.

+0

Hallo OMG Ponys, Sie sind der MySQL Terminator !! Super, vielen Dank für die Hilfe. Ich hätte es nie herausgefunden. (Mein SQL-Wissen ist grundlegend, also muss ich Ihre Antwort studieren, um es besser zu verstehen). Auch ich liebe deinen Bildschirmnamen. Nochmals, DANKE !!! -Laxmidi – Laxmidi

+0

"Sie können eine Kreuzverbindung (in MySQL, ein INNER JOIN ohne irgendwelche Kriterien) verwenden, um eine Variable zu deklarieren und zu verwenden, ohne eine separate SET-Anweisung zu verwenden." Verdammt, ich hatte keine Ahnung, dass Sie das tun könnten. +1 – heisenberg

+0

Ich würde dies wieder wählen, wenn ich könnte. Spektakulär. – duffymo

1

Klingt wie eine Middleware-Regel, die besser in Code ausgedrückt werden würde, der zwischen der Datenbank und dem Client lag.

Wenn das nicht möglich ist, würde ich eine gespeicherte Prozedur in MySQL empfehlen, um die Abfrage so auszuführen, wie Sie sie geschrieben haben, und dann die Ergebnisse mit einem Cursor und einem Array zu ändern.

+0

Hallo Duffymo, Vielen Dank für Ihren Kommentar. Ich schätze die Hilfe. -Laxmidi – Laxmidi

+0

OMG Ponies ist der Mann auf diesem. Was für eine tolle Antwort. – duffymo