Wybierz ostatni wiersz w MySQL


181

Jak mogę SELECTostatni wiersz w tabeli MySQL?

Ja INSERTing danych i trzeba pobrać wartość kolumny z poprzedniego rzędu.

Jest auto_incrementw tabeli.


8
Zdefiniuj „ostatni wiersz”. Ten z najwyższym ID? A może ostatnio dodany?
EboMike,

1
Co oznacza ostatni wiersz - Czy w tabeli znajduje się kolumna auto_increment lub DATETIME?
OMG Ponies

Tak, tam jest auto_increment. Chciałbym jeden ostatnio dodany.
esqew

9
Nie ma ostatniego rzędu w zestawie, jak powiedzieli EboMike i OMG Ponies. Co byś zrobił, gdybym dał ci torbę pełną piłek i poprosiłbym, żebyś dał mi ostatnią piłkę?
Vincent Savard

Odpowiedzi:


402

Tak, jest tam auto-wzrost

Jeśli chcesz ostatni z wszystkich wierszy w tabeli, to w końcu MAX(id)jest to właściwy moment ! Rodzaj:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
Obawiam się, że to zwalnia, jeśli trzeba posortować milion wierszy, prawda?
Slawa,

2
Właśnie przebiegłem to ponad 20m rzędami i było bardzo szybko. Zakładam, że istnieje jakiś szczególny przypadek obsługi tego zapytania. (EDYCJA: MySQL 5.7, silnik InnoDB)
Daniel Buckmaster

1
@Pekka: Nie chcę używać zamówienia według, czy jest jakaś inna opcja, aby to zrobić?
shiva

4
@ Slawa Nie, jeśli idjest indeksowany.
Markiz Lorne

31

Należy pamiętać, że tabele w relacyjnych bazach danych to tylko zestawy wierszy. A zbiory matematyki są nieuporządkowanymi zbiorami. Nie ma pierwszego ani ostatniego rzędu; brak poprzedniego lub następnego rzędu.

Najpierw musisz posortować zestaw nieuporządkowanych wierszy według jakiegoś pola, a następnie możesz iterować po zestawie wyników w zdefiniowanej kolejności.

Ponieważ masz pole automatycznego zwiększania, zakładam, że chcesz, aby było to pole sortowania. W takim przypadku możesz wykonać następujące czynności:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

Zobacz, jak najpierw sortujemy zestaw nieuporządkowanych wierszy według your_auto_increment_field(lub jakkolwiek to się nazywa) w kolejności malejącej. Następnie ograniczamy zestaw wyników do tylko pierwszego wiersza za pomocą LIMIT 1.


25

Możesz połączyć dwa zapytania sugerowane przez @spacepille w jedno zapytanie, które wygląda następująco:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

Powinien działać błyskawicznie, ale na stołach INNODB jest o ułamek milisekundy wolniejszy niż ORDER + LIMIT.


@karthikeyan napisał odpowiedź cztery dni temu, a ja odpowiedziałem na to w grudniu 2015 r.
vzr

nie, ja zredagowałem i poprawiłem niektóre pisownię 4 dni temu ... data publikacji to 2014 answered Jun 14 at 9:41, czyli około 1 rok i 6 miesięcy wcześniej :)
Dwza

Po prostu, aby oczyścić powietrze tutaj, vzr ma rację. „14 czerwca” oznacza 14 czerwca 2016 r. Również @karthikeyan jest członkiem tylko przez dwa miesiące w tym momencie.
Robert Brisita,

Ssooo ... Odpowiedź @ karthikeyan jest kopią tego!
Cliff Burton,

24

w tabelach z wieloma wierszami są dwa zapytania prawdopodobnie szybsze ...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;


4

Jeśli chcesz ostatnio dodany, dodaj znacznik czasu i wybierz opcję uporządkowaną w odwrotnej kolejności według najwyższego znacznika czasu, limit 1. Jeśli chcesz przejść według identyfikatora, posortuj według identyfikatora. Jeśli chcesz użyć tego, który TYLKO dodałeś, użyj mysql_insert_id.


4

Prawie każda tabela bazy danych zawiera kolumnę auto_increment (ogólnie id)

Jeśli chcesz ostatni z wszystkich wierszy w tabeli,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

LUB

Możesz połączyć dwa zapytania w jedno zapytanie, które wygląda następująco:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);

automatyczny przyrost jest dostępny tylko wtedy, gdy DBA (lub ktokolwiek stworzył tabelę) wdrożył automatyczne przyrosty
WhatsThePoint

2
SELECT * FROM adds where id=(select max(id) from adds);

To zapytanie służyło do pobrania ostatniego rekordu w tabeli.


Kopia odpowiedzi poniżej
Jbur43

2

Wiele odpowiedzi tutaj mówi to samo (zamów według automatycznego przyrostu), co jest OK, pod warunkiem, że masz indeksowaną kolumnę z automatyczną inkrementacją.

Na marginesie, jeśli masz takie pole i jest to klucz podstawowy, nie ma ograniczenia wydajności za użycie w order byporównaniu z select max(id). Kluczem podstawowym jest to, w jaki sposób dane są porządkowane w plikach bazy danych (przynajmniej dla InnoDB), a RDBMS wie, gdzie kończą się te dane, i może zoptymalizować order by id + limit 1się tak, aby osiągnąć taki sammax(id)

Teraz droga mniej uczęszczana jest wtedy, gdy nie masz automatycznie zwiększonego klucza głównego. Być może klucz podstawowy to klucz naturalny, który składa się z 3 pól ... Jednak nie wszystko zostało utracone. Z języka programowania możesz najpierw uzyskać liczbę wierszy

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

a następnie użyj uzyskanej liczby w LIMITklauzuli

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Niestety, MySQL nie zezwala na pod-zapytanie lub zmienną użytkownika w LIMITklauzuli


1

Można użyć OFFSETw LIMITpoleceniu:

SELECT * FROM aTable LIMIT 1 OFFSET 99

jeśli twoja tabela ma 100 wierszy, zwraca ostatni wiersz bez polegania na kluczu podstawowym

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.