Heim >Datenbank >MySQL-Tutorial >Wie kann ich mit einer einzigen SQL-Abfrage die neuesten Artikel aus mehreren Kategorien abrufen?

Wie kann ich mit einer einzigen SQL-Abfrage die neuesten Artikel aus mehreren Kategorien abrufen?

Linda Hamilton
Linda HamiltonOriginal
2025-01-22 02:06:12707Durchsuche

How Can I Retrieve the Newest Items from Multiple Categories Using a Single SQL Query?

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:

  • Skalierbarkeit: Verarbeitet effektiv eine beliebige Anzahl von Kategorien.
  • Robustheit: Funktioniert auch bei unterschiedlicher Anzahl von Elementen pro Kategorie oder Änderungen an der Kategoriestruktur korrekt.

Alternative Ansätze:

  • MySQL-Benutzervariablen:

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).

  • Fensterfunktionen (MySQL 8.0.3 und höher):

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn