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:
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:
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.
@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)FROMtable;SELECT*FROMtableWHERE id =@last_id;
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.
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
auto_increment
. Chciałbym jeden ostatnio dodany.Odpowiedzi:
Jeśli chcesz ostatni z wszystkich wierszy w tabeli, to w końcu
MAX(id)
jest to właściwy moment ! Rodzaj:źródło
id
jest indeksowany.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:
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
.źródło
Możesz połączyć dwa zapytania sugerowane przez @spacepille w jedno zapytanie, które wygląda następująco:
Powinien działać błyskawicznie, ale na stołach INNODB jest o ułamek milisekundy wolniejszy niż ORDER + LIMIT.
źródło
answered Jun 14 at 9:41
, czyli około 1 rok i 6 miesięcy wcześniej :)w tabelach z wieloma wierszami są dwa zapytania prawdopodobnie szybsze ...
źródło
Po prostu użyj:
PDO::lastInsertId
http://php.net/manual/en/pdo.lastinsertid.php
źródło
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
.źródło
Prawie każda tabela bazy danych zawiera kolumnę auto_increment (ogólnie id)
Jeśli chcesz ostatni z wszystkich wierszy w tabeli,
LUB
Możesz połączyć dwa zapytania w jedno zapytanie, które wygląda następująco:
źródło
To zapytanie służyło do pobrania ostatniego rekordu w tabeli.
źródło
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 by
porównaniu zselect 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 1
się 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
a następnie użyj uzyskanej liczby w
LIMIT
klauzuliNiestety, MySQL nie zezwala na pod-zapytanie lub zmienną użytkownika w
LIMIT
klauzuliźródło
Można użyć
OFFSET
wLIMIT
poleceniu:jeśli twoja tabela ma 100 wierszy, zwraca ostatni wiersz bez polegania na kluczu podstawowym
źródło