0

Erweiterung weiter von dieser Frage Query to find top rated article in each category entscheiden -Gruppe durch - Übergeordnete Standardverhalten von Zeile unter jeder Gruppe in Folge

Betrachten wir den gleichen Tisch -

id | category_id | rating 
---+-------------+------- 
1 |   1 |  10 
2 |   1 |  8 
3 |   2 |  7 
4 |   3 |  5 
5 |   3 |  2 
6 |   3 |  6 

ein Tisch Artikel ist, mit Feldern id, rating (eine ganze Zahl von 1-10) und category_id (eine Ganzzahl, die angibt, zu welcher Kategorie es gehört). Und wenn ich das gleiche Ziel der am besten bewerteten Artikel in jeder Abfrage zu erhalten (dies sollte das Ergebnis sein): -

Gewünschtes Ergebnis

id | category_id | rating 
---+-------------+------- 
1 |   1 |  10 
3 |   2 |  7 
6 |   3 |  6 

Erweiterung der ursprünglichen Frage
Aber, die folgende Abfrage ausgeführt wird -

SELECT id, category_id, max(rating) AS max_rating 
FROM `articles` 
GROUP BY category_id 

Ergebnisse in den folgenden, in der alles, mit Ausnahme des id f Feld, ist wie gewünscht. Ich weiß, wie man das mit einer Unterabfrage macht - wie in derselben Frage beantwortet - Using subquery.

id category_id  max_rating 
1 1    10 
3 2    7 
4 3    6 

In obs
Ohne die gruppierte Spalte (category_id) und den ausgewerteten Spalten (Spalten Ergebnisse der Aggregatfunktion wie SUM() Rückkehr MAX() usw. - in diesem Fall max_rating) kehrten die Werte in der andere Felder sind einfach die erste Zeile unter jedem gruppierten Ergebnissatz (gruppiert nach category_id in diesem Fall). Z.B. Der Datensatz mit id = 1 ist der erste in der Tabelle unter category_id 1 (id 1 und 2 unter category_id 1) so wird es zurückgegeben.

Ich frage mich nur, ist es nicht möglich, dieses Standardverhalten zu überwinden, um Zeilen basierend auf Bedingungen zurückzugeben? Wenn mysql Berechnungen für jede gruppierte Ergebnismenge durchführen kann (z. B. MAX() zählt usw.), warum kann dann nicht die Zeile zurückgegeben werden, die der maximalen Bewertung entspricht. Ist es nicht möglich, dies in einer einzigen Abfrage ohne Unterabfrage zu tun? Das sieht für mich wie eine häufige Anforderung aus.

aktualisieren
Ich konnte nicht herausfinden, was ich auch von Naktibalda Lösung wollen. Und um es noch einmal zu sagen, ich weiß, wie man das mit einer Unterabfrage macht, wie es wiederum von OMG Ponies beantwortet wird.

Antwort

1

Verwendung:

SELECT x.id, 
     x.category_id, 
     x.rating 
    FROM YOUR_TABLE x 
    JOIN (SELECT t.category_id, 
       MAX(t.rating) AS max_rating 
      FROM YOUR_TABLE t 
     GROUP BY t.category_id) y ON y.category_id = x.category_id 
           AND y.max_rating = x.rating 
Verwandte Themen