2016-07-10 12 views
2

Ich habe eine mySQL-Tabelle mit mehreren Einträgen von mehreren Benutzern (identifiziert durch Benutzer-ID). Eine vollständige Zeile enthält Benutzer-ID, Ort, Art und Gewicht. Ich möchte eine Rangliste mit dem schwersten Gewicht und der entsprechenden Position für jeden Benutzer für eine bestimmte Spezies haben.Erstellen einer Bestenliste aus einer mySQL-Tabelle

Ich habe versucht:

SELECT userid, location, f_weight_i FROM eac.catches WHERE f_weight_i = (SELECT MAX(f_weight_i) FROM eac.catches) AND species='32' GROUP BY userid ORDER BY f_weight_i 

aber es ergab keine Zeilen.

Ich habe auch versucht dies, und es gab das beste Gesamtgewicht:

SELECT userid, location, f_weight_i FROM eac.catches WHERE f_weight_i = (SELECT MAX(f_weight_i) FROM eac.catches) 

Wie kann ich am beste Gewicht für jeden Benutzer erhalten, für jede Art?

+0

Definieren Sie "beste" .. – Strawberry

+0

"beste" = max Gewicht. –

+0

Ah, 'schwerste'. – Strawberry

Antwort

0

können Sie verwenden, um einen Inline-View (MySQL nennt es eine abgeleitete Tabelle) für eine bestimmte Art die maximale f_weight_i für jeden Benutzer zu erhalten.

Dann verbinden Sie das Ergebnis von diesem zurück in die Tabelle, um die ganze Zeile zu erhalten.

So:

SELECT c.userid 
     , c.species 
     , c.location 
     , c.f_weight_i 
    FROM eac.catches c 
    JOIN ( 
      SELECT w.userid 
       , w.species 
       , MAX(w.f_weight_i) AS max_f_weight_i 
      FROM eac.catches w 
      WHERE w.species = '32' 
      GROUP BY w.userid, w.species 
     ) m 
     ON m.max_f_weight_i = c.f_weight_id 
    AND m.userid   = c.userid 
    AND m.species  = c.species 
    ORDER BY c.f_weight_i DESC 

Um die Ergebnisse für alle Arten zu erhalten, entfernen Sie die WHERE-Klausel aus der Inline-View-Abfrage (abgeleitete Tabelle m).

+0

Ich fühle mich wie die innere Abfrage ist alles was er braucht. – Kinetic

+0

@KiNeTiC manchmal Gefühle können so sein – Strawberry

+0

@KiNeTic: Die Inline-Ansicht erhält das maximale Gewicht. Aber das bringt nicht den Wert der "location" -Spalte von dieser Zeile mit der maximalen Gewichtung. Wenn OP die Spalte "location" nicht benötigt, wäre die Inline-View-Abfrage ausreichend. – spencer7593

0

Ich habe keine Zeit, um eine Testtabelle zu erstellen, aber das sollte Ihnen nahe kommen.

SELECT userid, location, species, f_weight_i 
FROM eac.catches INNER JOIN 
    (SELECT userid, species, MAX(f_weight_i) AS f_weight_i 
    FROM eac.catches GROUP BY userid, species) AS tmp 
ON eac.catches.userid = tmp.userid 
    AND eac.catches.species = tmp.species 
    AND eac.catches.f_weight_i = tmp.f_weight_i; 
Verwandte Themen