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.

esqew
źródło
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;
Pekka
źródło
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.

Daniel Vassallo
źródło
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.

vzr
źródło
@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;
spacepille
źródło
6

Po prostu użyj: PDO::lastInsertId

http://php.net/manual/en/pdo.lastinsertid.php

macio.Jun
źródło
2
Dobrze. Większość porządnych bibliotek interfejsu MySQL ma do tego dedykowane metody, jednak to pytanie nie oznaczało PHP, ale ogólną składnię MySQL.
vzr 12.04.17
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.

EboMike
źródło
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);
Sani Kamal
źródło
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.

karthikeyan
źródło
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

Ilia Gilmijarow
źródło
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

Benvorth
źródło