Position einer Zeile nach Sortierung ermitteln

Montag, 29. März 2010, 00:28 Uhr von Christian

In einer Tabelle sind Artikel mit Datum versehen, wie z. B.:

item     created
----------------
  1   2010-03-10
  2   2010-03-20
  3   2010-03-21
  4   2010-03-22
  5   2010-03-23
  6   2010-03-25
  7   2010-03-26
  8   2010-03-27
  9   2010-03-28
 10   2010-03-28

Nun soll zu einem bestimmten Artikel ermittelt werden, wie neu er ist, d. h. der wievielte er wäre, wenn alle Artikel nach Datum sortiert werden würden. Beispielsweise soll für den Artikel 8 die Position 3 ausgegeben werden, da er der drittneueste Artikel ist. Das lässt sich mit folgender Abfrage lösen:

SELECT `SortedItems`.`position`
FROM (
  SELECT t.`item`,
         @rowCount := @rowCount + 1 `position`
  FROM   `Test` t,
         (SELECT @rowCount := 0) `dummyTableName_notNeeded`
  ORDER BY `created` DESC
) `SortedItems`
WHERE `SortedItems`.`item` = "8"

In der inneren Abfrage werden nun also alle Artikel absteigend nach Datum sortiert, sodass der neueste Artikel an erster Stelle steht. Dabei wird eine Variable (rowCount) verwendet, die für jeden Artikel die aktuelle Zeilennummer mitzählt und in dem Zwischenergebnis in die Spalte position einträgt. Die Variable rowCount muss zuvor mit 0 initialisiert werden. Die äußere Abfrage liefert dann lediglich die Position des gewünschten Artikels.

Auf diese Lösung hat mich ein alter Kommentar zu dem Thema in einem anderen Blog gebracht.

Für alle, die damit selbst ein wenig spielen möchten, hier die Anweisungen zum Erzeugen und Füllen der Test-Tabelle:

CREATE TABLE `Test` (
  `item` int(11) NOT NULL,
  `created` date NOT NULL,
  PRIMARY KEY (`item`)
);

INSERT `Test` (`item`, `created`) VALUES
(1, '2010-03-10'),
(2, '2010-03-20'),
(3, '2010-03-21'),
(4, '2010-03-22'),
(5, '2010-03-23'),
(6, '2010-03-25'),
(7, '2010-03-26'),
(8, '2010-03-27'),
(9, '2010-03-28'),
(10, '2010-03-28');

Geschrieben in: MySQL | Schlagwörter: ,
Keine Kommentare »