Como eu faria algo assim?
Linha SQL SELECT FROM tabela WHERE id = max (id)
Como eu faria algo assim?
Linha SQL SELECT FROM tabela WHERE id = max (id)
Respostas:
Você pode usar uma subseleção:
SELECT row
FROM table
WHERE id=(
SELECT max(id) FROM table
)
Observe que, se o valor de max(id)
não for exclusivo, várias linhas serão retornadas.
Se você quiser apenas uma dessas linhas, use a resposta de @ MichaelMior,
SELECT row from table ORDER BY id DESC LIMIT 1
id
é apenas uma coluna em uma tabela. Não há garantia de que os valores na id
coluna tenham que ser exclusivos.
id
não seja uma chave primária ou única :) Dado o nome, há uma chance razoável de que seja. Também é importante notar que, dependendo do DBMS que você está usando, a abordagem com a subseleção pode ser muito menos eficiente.
id
pode ser uma chave estrangeira; nesse caso, pode não ser única. Fiz alguns testes comparativos set profiling = 1; ...; show profiles
e parece que nossas soluções têm o mesmo desempenho usando o MySQL. Para meu próprio conhecimento, você sabe qual DBMS tem desempenho inferior para as sub-seleções?
Você também pode fazer
SELECT row FROM table ORDER BY id DESC LIMIT 1;
Isso classificará as linhas por seu ID em ordem decrescente e retornará a primeira linha. É o mesmo que retornar a linha com o ID máximo. Obviamente, isso pressupõe que id
é único entre todas as linhas. Caso contrário, pode haver várias linhas com o valor máximo para id
e você obterá apenas uma.
SELECT *
FROM table
WHERE id = (SELECT MAX(id) FROM TABLE)
SELECT entry FROM table WHERE id = MAX(id)
não funcionaria ?!
SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)
pelo qual eu só preciso da entry_time
entrada mais recente no banco de dados. Essa declaração é suficiente ou deveria ser:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
Você não pode dar order by
porque order by
faz uma "verificação completa" em uma tabela.
A seguinte consulta é melhor:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);
ORDER BY
não fará uma varredura completa se você assumir que essa id
é a chave primária da tabela. (E, se não estiver, é um nome muito ruim.) Se não estiver, como você espera MAX(id)
trabalhar sem uma verificação completa da tabela? Se não houver índice, todos os valores ainda deverão ser verificados para encontrar o máximo.
Pode-se sempre optar por funções analíticas, o que lhe dará mais controle
select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1
Se você tiver problemas com a função rank (), dependendo do tipo de dados, poderá escolher entre row_number () ou dense_rank () também.
Tente com isso
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table