Heim > Datenbank > MySQL-Tutorial > Wie rufe ich die vier neuesten Elemente pro Kategorie mit einer einzigen SQL-Abfrage ab?

Wie rufe ich die vier neuesten Elemente pro Kategorie mit einer einzigen SQL-Abfrage ab?

Linda Hamilton
Freigeben: 2025-01-22 01:57:09
Original
200 Leute haben es durchsucht

How to Retrieve the Four Newest Items Per Category with a Single SQL Query?

Wählen Sie die neuesten Artikel in jeder Kategorie mit einer einzigen Abfrage aus

In einer Datenbank mit Artikeln, die nach einem Feld namens category_id klassifiziert sind, besteht die Aufgabe darin, eine Liste von Kategorien abzurufen, die jeweils die vier zuletzt aufgelisteten Artikel enthalten. Anstatt die Datenbank für jede Kategorie einzeln abzufragen, verwenden Sie eine einzige SQL-Abfrage, um die Datenbankaufrufe zu optimieren.

Lösung mit Outer Join:

Die folgende Abfrage verwendet einen Outer-Join, um Elemente zu identifizieren und auszuschließen, die aktualisierte Gegenstücke in derselben Kategorie haben:

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.category_id, i1.item_id
HAVING COUNT(*) <= 4;
Nach dem Login kopieren

Diese Abfrage verwendet LEFT OUTER JOIN, um jedes Element (i1) mit seinem aktualisierten Satz von Elementen (i2) zu verbinden, die dieselbe Kategorie haben. COUNT(*) Wird verwendet, um die Anzahl der Übereinstimmungen für jedes Element in jeder Kategorie zu zählen. Die HAVING-Klausel filtert Elemente mit mehr als vier Übereinstimmungen heraus und stellt so sicher, dass nur die vier neuesten Elemente in jeder Kategorie ausgewählt werden.

Lösung mit MySQL-Benutzervariablen:

Diese Lösung nutzt die Benutzervariablenfunktion von MySQL, um Gruppen- und Zeilennummern zu verfolgen:

SELECT *
FROM (
    SELECT i.*, @r := IF(@g = category_id, @r+1, 1) AS rownum, @g := category_id
    FROM (SELECT @g:=null, @r:=0) AS _init
    CROSS JOIN item i
    ORDER BY i.category_id, date_listed DESC
) AS t
WHERE t.rownum <= 4;
Nach dem Login kopieren

In dieser Abfrage werden die benutzerdefinierten Variablen @g und @r verwendet, um die aktuelle Kategorie und Zeilennummer zu verfolgen und sicherzustellen, dass nur die ersten vier Elemente in jeder Kategorie ausgewählt werden.

Lösung mit MySQL-Fensterfunktionen (MySQL 8.0.3):

MySQL 8.0.3 führt die Unterstützung für SQL-Standardfensterfunktionen ein und bietet so eine präzisere und effizientere Lösung:

WITH numbered_item AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY date_listed DESC) AS rownum
  FROM item
)
SELECT * FROM numbered_item WHERE rownum <= 4;
Nach dem Login kopieren

Diese Abfrage verwendet die PARTITION BY category_id ORDER BY date_listed DESC-Klausel, um die Ergebnismenge nach Kategorie zu partitionieren und die Elemente in absteigender Reihenfolge nach der date_listed-Spalte in jeder Partition zu sortieren. Die Fensterfunktion ROW_NUMBER() weist dann jeder Partition fortlaufende Zeilennummern zu und ermöglicht so die Auswahl der ersten vier Elemente jeder Kategorie.

Das obige ist der detaillierte Inhalt vonWie rufe ich die vier neuesten Elemente pro Kategorie mit einer einzigen SQL-Abfrage ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage