Selecione a última linha no MySQL

181

Como posso SELECTa última linha em uma tabela MySQL?

Estou INSERTinserindo dados e preciso recuperar um valor da coluna da linha anterior.

Há um auto_incrementna mesa.

esqew
fonte
8
Defina "última linha". Aquele com o ID mais alto? Ou o adicionado mais recentemente?
EboMike
1
O que indica a última linha - Existe uma coluna auto_increment ou DATETIME na tabela?
OMG Ponies
Sim, há um auto_incrementlá dentro. Eu gostaria do mais recentemente adicionado.
esqew
9
Não há última linha em um conjunto, como disseram EboMike e OMG Ponies. O que você faria se eu lhe desse uma sacola cheia de bolas e pedisse que você me desse a última bola?
Vincent Savard

Respostas:

402

Sim, há um incremento automático lá

Se você deseja a última de todas as linhas da tabela, este é finalmente o momento em que MAX(id)está a resposta certa! Mais ou menos:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;
Pekka
fonte
12
Receio que isso fique lento se precisar ordenar milhões de linhas, não é?
Slawa
2
Acabei de executar isso com mais de 20m de linhas e foi muito rápido. Suponho que haja algum tipo de caso especial para lidar com essa consulta. (EDIT: MySQL 5.7, mecanismo InnoDB)
Daniel Buckmaster
1
@Pekka: Eu não quero usar a ordem, existe alguma outra opção para fazer isso?
Shiva
4
@ Slawa Não se idestá indexado.
Marquês de Lorne #
31

Lembre-se de que as tabelas nos bancos de dados relacionais são apenas conjuntos de linhas. E conjuntos em matemática são coleções não ordenadas. Não há primeira ou última linha; nenhuma linha anterior ou próxima linha.

Você precisará classificar seu conjunto de linhas não-ordenadas primeiro por algum campo e, em seguida, liberará a iteração pelo conjunto de resultados na ordem que você definiu.

Como você possui um campo de incremento automático, presumo que você queira que esse seja o campo de classificação. Nesse caso, você pode fazer o seguinte:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

Veja como classificamos primeiro o conjunto de linhas não ordenadas pelo your_auto_increment_field(ou como você o chamou) em ordem decrescente. Em seguida, limitamos o conjunto de resultados apenas à primeira linha com LIMIT 1.

Daniel Vassallo
fonte
25

Você pode combinar duas consultas sugeridas por @spacepille em uma consulta semelhante à seguinte:

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

Ele deve funcionar rapidamente, mas nas tabelas INNODB é uma fração de milissegundo mais lento que ORDER + LIMIT.

vzr
fonte
@karthikeyan escreveu sua resposta há quatro dias e eu respondi isso em dezembro 2015.
vzr
Não, me editado e corrigido algumas grafias 4 dias atrás ... Data de publicação é de 2014 answered Jun 14 at 9:41é sobre 1 ano e 6 meses mais cedo :)
Dwza
Apenas para limpar o ar aqui vzr está certo. O '14 de junho' significa 14 de junho de 2016 e também @karthikeyan é membro há apenas dois meses.
Robert Brisita
Ssooo ... A resposta de @ karthikeyan é uma cópia deste!
Cliff Burton
24

em tabelas com muitas linhas há duas consultas provavelmente mais rápidas ...

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

SELECT * FROM table WHERE id = @last_id;
spacepille
fonte
6

Faça simplesmente usar: PDO::lastInsertId

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

macio.Jun
fonte
2
Certo. A maioria das bibliotecas decentes de interface do MySQL tem métodos dedicados para isso, no entanto, essa pergunta não foi marcada como PHP, mas como sintaxe geral do MySQL.
vzr
4

Se você deseja adicionar o mais recente, adicione um registro de data e hora e selecione ordenado na ordem inversa pelo registro de data e hora mais alto, limite 1. Se você deseja selecionar por ID, classifique por ID. Se você deseja usar o que você acabou de adicionar, use mysql_insert_id.

EboMike
fonte
4

Quase todas as tabelas do banco de dados, há uma coluna auto_increment (geralmente id)

Se você deseja a última de todas as linhas da tabela,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

OU

Você pode combinar duas consultas em uma consulta que se parece com isso:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);
Sani Kamal
fonte
auto incremento é só lá se o DBA (ou quem fez a mesa) incrementos auto implementadas
WhatsThePoint
2
SELECT * FROM adds where id=(select max(id) from adds);

Esta consulta costumava buscar o último registro na sua tabela.

karthikeyan
fonte
Cópia da resposta abaixo
Jbur43 2/19/19
2

Muitas respostas aqui dizem o mesmo (ordem pelo seu incremento automático), o que é bom, desde que você tenha uma coluna com incremento automático indexada.

Em uma nota lateral, se você tiver esse campo e for a chave principal, não haverá penalidade no desempenho por usar order byversus select max(id). A chave primária é como os dados são ordenados nos arquivos de banco de dados (pelo menos para o InnoDB), e o RDBMS sabe onde esses dados terminam e pode otimizar order by id + limit 1para ser o mesmo que alcançar omax(id)

Agora, a estrada menos percorrida é quando você não possui uma chave primária com incremento automático. Talvez a chave primária seja uma chave natural, composta por 3 campos ... Porém, nem tudo está perdido. Em uma linguagem de programação, você pode obter primeiro o número de linhas com

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

e depois use o número obtido na LIMITcláusula

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Infelizmente, o MySQL não permitirá uma subconsulta ou variável de usuário na LIMITcláusula

Ilia Gilmijarow
fonte
1

Você pode usar um OFFSETem um LIMITcomando:

SELECT * FROM aTable LIMIT 1 OFFSET 99

caso sua tabela tenha 100 linhas, retorne a última linha sem depender de uma chave_primária

Benvorth
fonte