2011-01-17 3 views
12

Ich habe eine Logintime Tabelle wie folgt aus:Wie letzte Datensatz (unter der Bedingung) löschen aus einer Tabelle in MySql

id | user_id | datetime 
1 | 1  | 2011-01-17 18:51:05 
2 | 1  | 2011-01-18 18:51:05 
3 | 1  | 2011-01-19 18:51:05 
4 | 2  | 2011-01-19 18:51:05 

ich letzte Datensatz für user_id=1 löschen möchten. Der letzte Datensatz eines Benutzers kann von datetime erkannt werden.

Wie kann ich dies mit einer Abfrage tun.

Antwort

25

Sie müssen die Tabelle nach user_id filtern (zB WHERE user_id = 1), dann nach Zeit sortieren (zB ORDER BY datetime) und dann die Abfrage auf nur einen Gegenstand beschränken (zB LIMIT 1) und das Ergebnis löschen dieser Abfrage. Am Ende youl Abfrage wie folgt erhalten:

DELETE FROM LoginTime WHERE user_id=1 ORDER BY datetime DESC LIMIT 1 
+0

was ist, wenn es gab 2 Datensätze für user_id = 1 mit dem gleichen maximalen Datetime – nan

+0

Einer von ihnen wird ... gelöscht werden kann oder nicht Je nach Szenario sinnvoll. –

+0

In diesen Fällen würde ich normalerweise id anstelle eines Zeitstempels verwenden, um den neuesten zu bestimmen. Wenn id auf auto-increment gesetzt ist, hat der letzte Eintrag in der Datenbank immer die höchste ID (zB DELETE FROM LoginTime WHERE user_id = 1 ORDER BY ID DESC LIMIT 1) – Ivan

2
DELETE FROM logintime t1 
    JOIN 
    (
    SELECT MAX(datetime) 
     AS max_dt 
     FROM logintime 
     WHERE user_id = 1 
    ) t2 
WHERE t1.datetime = t2.max_dt 
    AND user_id = 1 
+0

Ich fürchte, dies wird SQL-Fehler 1093 auslösen: * Sie können Zieltabelle '' für die Aktualisierung in FROM-Klausel * –

+0

@Salman A Dank, korrigierte ich es. – nan

+0

Danke für Ihre Antwort. Es sieht komplex aber nützlich aus. Ich dachte einfach. – Awan

0
DELETE FROM table name 
RIGHT JOIN (SELECT COUNT(primary key) 
      FROM table name) 
Verwandte Themen