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:
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:
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.
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.
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
auto_increment
lá dentro. Eu gostaria do mais recentemente adicionado.Respostas:
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:fonte
id
está indexado.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:
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 comLIMIT 1
.fonte
Você pode combinar duas consultas sugeridas por @spacepille em uma consulta semelhante à seguinte:
Ele deve funcionar rapidamente, mas nas tabelas INNODB é uma fração de milissegundo mais lento que ORDER + LIMIT.
fonte
answered Jun 14 at 9:41
é sobre 1 ano e 6 meses mais cedo :)em tabelas com muitas linhas há duas consultas provavelmente mais rápidas ...
fonte
Faça simplesmente usar:
PDO::lastInsertId
http://php.net/manual/en/pdo.lastinsertid.php
fonte
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
.fonte
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,
OU
Você pode combinar duas consultas em uma consulta que se parece com isso:
fonte
Esta consulta costumava buscar o último registro na sua tabela.
fonte
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 by
versusselect 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 otimizarorder by id + limit 1
para 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
e depois use o número obtido na
LIMIT
cláusulaInfelizmente, o MySQL não permitirá uma subconsulta ou variável de usuário na
LIMIT
cláusulafonte
Você pode usar um
OFFSET
em umLIMIT
comando:caso sua tabela tenha 100 linhas, retorne a última linha sem depender de uma chave_primária
fonte