Wählen Sie die letzten N Zeilen aus MySQL aus

120

Ich möchte die letzten 50 Zeilen aus der MySQL-Datenbank in der Spalte id auswählen, die der Primärschlüssel ist . Ziel ist es, die Zeilen nach ID in ASC- Reihenfolge zu sortieren. Deshalb funktioniert diese Abfrage nicht

SELECT 
    *
FROM
    `table`
ORDER BY id DESC
LIMIT 50;

Es ist auch bemerkenswert, dass Zeilen manipuliert (gelöscht) werden können, und deshalb funktioniert die folgende Abfrage auch nicht

SELECT 
    *
FROM
    `table`
WHERE
    id > ((SELECT 
            MAX(id)
        FROM
            chat) - 50)
ORDER BY id ASC;

Frage : Wie ist es möglich, die letzten N Zeilen aus der MySQL-Datenbank abzurufen, die manipuliert werden können und in ASC-Reihenfolge vorliegen?

Nanobash
quelle

Antworten:

236

Sie können dies mit einer Unterabfrage tun:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC

Dadurch werden die letzten 50 Zeilen ausgewählt tableund in aufsteigender Reihenfolge sortiert.

neue Möbel
quelle
5
^ Zu Ihrer Information, ich weiß, dass es in diesem Artikel um MySQL geht, wollte aber darauf hinweisen, dass das Weglassen der externen Auswahl und des Alias ​​in Postgres (9.3.5) als Antwort auf den obigen Kommentar von @ DiegoDD nicht zu funktionieren scheint. Ich erhalte die Meldung "Fehler: Mehrere ORDER BY-Klauseln nicht zulässig". Die akzeptierte Antwort funktioniert jedoch wie erwartet in Postgres
Allenwlee
Danke dafür! Diese Abfrage hat mir geholfen, mein Problem zu beheben. Ich habe stundenlang danach gesucht
Arshad
1
Wie kann ich diese Abfrage mit JOINS anwenden?
GYaN
@ GYaN Add Joins in der inneren Unterabfrage
Sheikh Hamza
9
SELECT * FROM table ORDER BY id DESC,datechat desc LIMIT 50

Wenn Sie ein Datumsfeld haben, in dem das Datum (und die Uhrzeit) gespeichert sind, an dem der Chat gesendet wurde, oder ein Feld, das mit inkrementellen (Reihenfolge nach DESC) oder nicht inkrementellen (Reihenfolge nach ASC) Daten pro Zeile gefüllt ist, setzen Sie es als zweite Spalte ein welche die Daten bestellen sollen.

Das hat bei mir funktioniert !!!! hoffe es wird helfen !!!!

aidonsnous
quelle
7
SELECT * FROM table ORDER BY id DESC LIMIT 50

Ressourcen sparen machen eine Abfrage, es ist nicht nötig, verschachtelte Abfragen zu machen

Summen
quelle
1
Ihre Abfrage gibt die Ergebnisse in umgekehrter Reihenfolge zurück (absteigende ID). Bei der Abfrage von @ newfurniturey werden die zuletzt eingefügten Zeilen ( LIMITbei absteigender ID) abgerufen, und das Endergebnis enthält aufsteigende IDs.
Robin Kanters
1
Ihre Lösung wird die Ergebnisse nicht in der richtigen Reihenfolge erhalten, sondern sie werden umgekehrt.
Daher ist
1
Aber dann machst du einfach ein php array_reverse () oder was auch immer das Äquivalent in der Skriptsprache deiner Wahl ist. Die Datenbank muss diese Arbeit nicht erledigen.
Joe
6
@Joe Die Frage enthält nichts, was darauf hindeutet, dass eine Skriptsprache verwendet wird. Dies ist also keine sichere Annahme.
Nick Coons
Die erwartete Antwort sollte bereits nur mit der Datenbankabfrage sortiert werden.
d4ryl3
-2
select * from Table ORDER BY id LIMIT 30

Anmerkungen: * idsollte eindeutig sein. * Sie können die Anzahl der zurückgegebenen Zeilen steuern, indem Sie die 30in der Abfrage ersetzen

Darshan
quelle
1
Könnten Sie bitte Ihre Lösung erklären? Die Erklärung in Klammern scheint Code zu sein. Setzen Sie einen ganzen Satz über / unter Ihren Code. Danke
deHaar