MYSQL - in einer Tabelle nur die 2 jüngsten Einträge pro Spalte -'Name' behalten.

null_Ahnung

Grünschnabel
Hallo,

bitte bei folgendem Problem helfen, danke!
Folgende Tabelle:

Name EndeZeit EndeDatum
ACC00 01:00 2013-06-04
ACC00 02:00 2013-06-04
ACC00 03:00 2013-06-04
ACC00 04:00 2013-06-04
ACC01 23:00 2013-06-02
ACC01 23:45 2013-06-03
ACC01 05:30 2013-06-04

Wie kann ich aus dieser Tabelle, als Beispiel, pro ‘Name‘ nur die jeweils zwei jüngsten Einträge ausgeben, bzw. die anderen alten Einträge löschen?
Ausgabe:
Name EndeZeit EndeDatum
ACC00 03:00 2013-06-04
ACC00 04:00 2013-06-04
ACC01 23:45 2013-06-03
ACC01 05:30 2013-06-04

Ich wollte erst alles durchnummerieren und dann alles was >= 3 ist löschen. Ich weiß aber nicht wie bei neuem Namen von vorne durchnummeriert werden soll! (Gerne auch eine andere Vogehensweise!)
SELECT @rownum := @rownum +1 `rank` , `y` . *
FROM (
SELECT @rownum :=0
) AS `z` , logbestand AS `y`
ORDER BY `Name` ASC , CONCAT( EndeDatum, ' ', EndeZeit ) DESC

Ausgabe nach SQL-Abfrage:
rank Name EndeZeit EndeDatum
1 ACC00 04:00 2013-06-04
2 ACC00 03:00 2013-06-04
3 ACC00 02:00 2013-06-04
4 ACC00 01:00 2013-06-04
5 ACC01 05:30 2013-06-04 -->> ab hier sollte rank wieder bei 1 beginnen
6 ACC01 23:45 2013-06-03
7 ACC01 23:00 2013-06-02
 
Der Ansatz ist gut. Du musst aber jeweils den Namen mit dem Namen der verhergehenden Zeile vergleichen

SQL:
SELECT
    *
FROM
    (
        SELECT 
            y.*,
            @rownum := IF(@lastName = y.name, @rownum +1, 1)    AS rank, 
            @lastName := y.name                                 AS to_ignore    
        FROM 
            (SELECT @rownum :=0, @lastName := '') AS z , 
            logbestand AS y
        ORDER BY 
            Name ASC , 
            CONCAT( EndeDatum, ' ', EndeZeit ) DESC
    )
WHERE
    rank <= 2
 
Zuletzt bearbeitet von einem Moderator:
Wenn ich den Select so absetze wie angegeben, bekomme ich folgende Meldung:

#1248 - Every derived table must have its own alias



Was ist damit genau gemeint?
Danke schön!
 
Damit ist gemeint, dass ich vergessen habe dem Subquery einen alias zu geben

SQL:
SELECT
    *
FROM
    (
        SELECT 
            y.*,
            @rownum := IF(@lastName = y.name, @rownum +1, 1)    AS rank, 
            @lastName := y.name                                 AS to_ignore    
        FROM 
            (SELECT @rownum :=0, @lastName := '') AS z , 
            logbestand AS y
        ORDER BY 
            Name ASC , 
            CONCAT( EndeDatum, ' ', EndeZeit ) DESC
-- Ich benenne diese Daten jetzt mal a
    ) AS a
WHERE
    rank <= 2
 
Zurück