Wybierz ostatnie N wierszy z MySQL

121

Chcę wybrać ostatnie 50 wierszy z bazy danych MySQL w kolumnie o nazwie id, która jest kluczem podstawowym . Celem jest, aby wiersze były sortowane według identyfikatora w kolejności ASC , dlatego to zapytanie nie działa

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

Niezwykłe jest również to, że wiersze można manipulować (usuwać) i dlatego poniższe zapytanie również nie działa

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

Pytanie : Jak można pobrać ostatnie N wierszy z bazy danych MySQL, którymi można manipulować i które są uporządkowane według ASC?

nanobash
źródło

Odpowiedzi:

236

Możesz to zrobić za pomocą zapytania podrzędnego:

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

Spowoduje to wybranie ostatnich 50 wierszy z table, a następnie uporządkowanie ich w kolejności rosnącej.

newfurniturey
źródło
5
^ FYI, wiem, że ten artykuł dotyczy MySQL, ale chciałem doradzić, że w odpowiedzi na komentarz @ DiegoDD powyżej, pominięcie zewnętrznego wyboru i aliasu nie wydaje się działać w Postgres (9.3.5). Wyświetla się komunikat „Błąd: niedozwolone są wielokrotne klauzule ORDER BY”. Przyjęta odpowiedź działa jednak zgodnie z oczekiwaniami w Postgres
allenwlee
Dzięki za to! To zapytanie pomogło mi rozwiązać problem. Szukałem tego od godzin
Arshad
1
Jak mogę zastosować to zapytanie do JOINS?
Gyan
@GYaN add joins w wewnętrznym zapytaniu podrzędnym
szejk hamza,
9
SELECT * FROM table ORDER BY id DESC,datechat desc LIMIT 50

Jeśli masz pole daty, które przechowuje datę (i godzinę) wysłania czatu lub dowolne pole, które jest wypełniane przyrostowo (kolejność według DESC) lub desinscrementally (kolejność według ASC) danymi na wiersz, umieść je jako drugą kolumnę które dane mają być uporządkowane.

To właśnie na mnie zadziałało !!!! mam nadzieję, że to pomoże !!!!

aidonsnous
źródło
7
SELECT * FROM table ORDER BY id DESC LIMIT 50

zapisz zasoby wykonaj jedno zapytanie, nie ma potrzeby wykonywania zapytań zagnieżdżonych

Brzęczeć
źródło
1
Twoje zapytanie zwróci wyniki w odwrotnej kolejności (malejąco id). Zapytanie @ newfurniturey otrzyma OSTATNIE wstawione wiersze ( LIMITw malejącym identyfikatorze), a ostateczny wynik będzie miał rosnące identyfikatory.
Robin Kanters,
1
Twoje rozwiązanie nie przyniesie wyników we właściwej kolejności, zamiast tego spowoduje ich odwrócenie, dlatego potrzeba kolejnego zamówienia, aby ponownie uzyskać je we właściwej kolejności
Cobra47
1
Ale wtedy po prostu wykonujesz php array_reverse () lub jakikolwiek odpowiednik w wybranym języku skryptowym. Baza danych nie musi wykonywać tej pracy.
Joe
6
@Joe W pytaniu nie ma nic, co wskazywałoby, że używany jest język skryptowy, więc nie jest to bezpieczne założenie.
Nick Coons,
Oczekiwana odpowiedź powinna już być posortowana przy użyciu samego zapytania do bazy danych.
d4ryl3
-2
select * from Table ORDER BY id LIMIT 30

Uwagi: * idpowinno być niepowtarzalne. * Możesz kontrolować liczbę zwracanych wierszy, zastępując 30w zapytaniu

Darszan
źródło
1
Czy mógłbyś wyjaśnić swoje rozwiązanie? Wyjaśnienie w nawiasach wydaje się być kodem, umieść całe zdanie powyżej / poniżej kodu. Dzięki
deHaar