Heim >Datenbank >MySQL-Tutorial >Wie kann man in SQL effizient Minimal- und Maximalwerte pro Gruppe finden, ohne Ranking-Funktionen zu verwenden?
Dieses Tutorial befasst sich mit der Frage, wie Datensätze mit den höchsten oder kleinsten Werten für a abgerufen werden angegebenes Feld innerhalb jeder Gruppe, ohne sich auf die Rangfolge (@Rank) zu verlassen. Während diese erste Frage @Rank als Lösung verwendete, zeigen nachfolgende Antworten einen effizienteren Ansatz mithilfe von Joins.
Um die Zeile mit dem höchsten OrderField für jede Gruppe zu erhalten, verwenden Sie ein linkes Äußeres Join und die folgende Abfrage:
SELECT t1.* FROM `Table` AS t1 LEFT OUTER JOIN `Table` AS t2 ON t1.GroupId = t2.GroupId AND t1.OrderField < t2.OrderField WHERE t2.GroupId IS NULL ORDER BY t1.OrderField;
Wenn mehrere Datensätze innerhalb einer Gruppe dasselbe OrderField haben und Sie einen davon benötigen, können Sie die Bedingung erweitern als folgt:
SELECT t1.* FROM `Table` AS t1 LEFT OUTER JOIN `Table` AS t2 ON t1.GroupId = t2.GroupId AND (t1.OrderField < t2.OrderField OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id)) WHERE t2.GroupId IS NULL
Diese verfeinerte Abfrage stellt sicher, dass t1 nur zurückgegeben wird, wenn keine andere Zeile t2 innerhalb derselben Gruppen-GroupId vorhanden ist, die entweder einen höheren OrderField-Wert oder ein gleiches OrderField mit einem niedrigeren Id-Wert hat. Somit wird effektiv die Zeile mit dem größten OrderField innerhalb jeder Gruppe abgerufen.
Die Verwendung des Left-Outer-Join-Ansatzes kann die Abfrageleistung im Vergleich zur früheren Methode mit @Rank und Unterabfragen erheblich verbessern. Der linke äußere Join kann einen Index für (GroupId, OrderField) für optimierten Zugriff nutzen.
Der anfängliche Ansatz mit @Rank funktioniert aufgrund der Tatsache möglicherweise nicht wie erwartet @Rank-Inkremente werden fortgesetzt, nachdem die erste Tabelle verarbeitet wurde. Um @Rank zwischen Tabellen auf Null zurückzusetzen, müssten Sie eine zusätzliche abgeleitete Tabelle einführen, was jedoch zu einer schlechten Optimierung führen kann.
Das obige ist der detaillierte Inhalt vonWie kann man in SQL effizient Minimal- und Maximalwerte pro Gruppe finden, ohne Ranking-Funktionen zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!