Heim >Datenbank >MySQL-Tutorial >Wie kann ich mit einer einzigen SQL-Abfrage die neuesten Artikel aus mehreren Kategorien abrufen?
Einzelne SQL-Abfrage zum Abrufen der neuesten Elemente aus verschiedenen Kategorien
In diesem Artikel werden effiziente SQL-Lösungen zum Abrufen der neuesten Elemente über mehrere Kategorien hinweg mithilfe einer einzigen Datenbankabfrage vorgestellt, wodurch Datenbankaufrufe minimiert werden.
SQL-Lösung: Nutzung von Outer Joins
Das „größte-n-pro-Gruppe“-Problem wird elegant mithilfe von Outer-Joins gelöst:
<code class="language-sql">SELECT i1.* FROM item i1 LEFT OUTER JOIN item i2 ON (i1.category_id = i2.category_id AND i1.item_id < i2.item_id) GROUP BY i1.item_id HAVING COUNT(i2.item_id) < 4;</code>
Diese Abfrage wählt effizient Artikel mit weniger als vier neueren Artikeln in ihren jeweiligen Kategorien aus.
Erklärung:
Die Abfrage verknüpft jedes Element (i1
) mit anderen Elementen (i2
) in derselben Kategorie, die einen höheren item_id
haben (was bedeutet, dass sie neuer sind). Die HAVING
-Klausel filtert Elemente mit drei oder mehr neueren Elementen heraus, sodass nur die vier neuesten Elemente pro Kategorie übrig bleiben.
Vorteile:
Alternative Ansätze:
Diese Methode verwendet die benutzerdefinierten Variablen von MySQL, um Zeilennummern zuzuweisen und die vier neuesten Elemente pro Kategorie zu identifizieren. (Dieser Ansatz ist weniger portierbar als die Outer-Join-Methode).
MySQL 8.0.3 unterstützt Standard-SQL-Fensterfunktionen und bietet so eine übersichtlichere Lösung:
<code class="language-sql">WITH numbered_item AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id DESC) AS rownum FROM item ) SELECT * FROM numbered_item WHERE rownum <= 4;</code>
Dieser Ansatz unterteilt Elemente nach Kategorie, weist Zeilennummern basierend auf item_id
zu (in absteigender Reihenfolge, wobei die neuesten zuerst erscheinen) und wählt dann die obersten vier Zeilen aus jeder Partition aus.
Das obige ist der detaillierte Inhalt vonWie kann ich mit einer einzigen SQL-Abfrage die neuesten Artikel aus mehreren Kategorien abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!