2017-02-01 4 views
1

Sagen wir, ich habe eine Tabelle mit Spalten:alle Zeilen löschen mit Ausnahme

id, username, createdat(timestamp). 

Wie lösche ich alle Zeilen für einen einzelnen Benutzer mit Ausnahme der älteste 20?

Also im Grunde Zeilen für andere Benutzer sollten unberührt sein.

Ich weiß, dass der Code unten falsch ist, aber immer noch teilen wollte, was ich bisher habe. Jede Eingabe oder Anregung ist willkommen.

SELECT 
    * 
FROM 
    tableA 
WHERE 
    NOT EXISTS(SELECT 
      * 
     FROM 
      tableA 
     WHERE 
      username = 'abcdefg' 
     ORDER BY id ASC 
     LIMIT 20) 
+0

danke! Ich schätze den Schnitt! – shle2821

+0

postgresql. Meinst du, die Abfragen würden anders sein, wenn ich mysql verwende? – shle2821

+0

danke! Wusste nicht, dass – shle2821

Antwort

1

Sie sind in der Nähe.

DELETE FROM 
    tableA 
WHERE 
    id NOT IN(
    SELECT 
     id 
    FROM 
     tableA 
    WHERE 
     username = 'abcdefg' 
    ORDER BY createdat ASC LIMIT 20) 
    AND 
    username = 'abcdefg' 
1

können Sie versuchen, ein DELETE mit einem linken tun zu einer Unterabfrage kommen, die den 20-Datensätze für eine bestimmte Verwendung identifiziert, die sollten nicht gelöscht werden.

DELETE a 
FROM tableA a 
LEFT JOIN 
(
    SELECT id 
    FROM tableA 
    WHERE username = 'abcdefg' 
    ORDER BY id 
    LIMIT 20 
) b 
    ON a.id = b.id 
WHERE b.id IS NULL AND 
     a.username = 'abcdefg' 
1

Mit delete und left join.

DELETE FROM a USING tableA a 
     LEFT JOIN 
    (SELECT 
     id 
    FROM 
     tableA 
    WHERE 
     username = 'abcdefg' 
    ORDER BY id 
    LIMIT 20) b ON a.id = b.id 
WHERE 
    b.id IS NULL AND a.username = 'abcdefg'; 
1

Verwenden Common Table Expression wie folgt aus: -

;WITH CTE 
AS 
(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY username ORDER BY createdat DESC) UserLevelId 
    FROM [YourTable] 
) 
DELETE FROM CTE 
WHERE CTE.UserLevelId > 20 
AND CTE.username IN (........) 

Hoffnung, das hilft.

+0

Begrenzen Sie auf den gewünschten Benutzer, indem Sie hinzufügen: - WHERE Benutzername IN (........) –

Verwandte Themen