Buscar registro anterior e próximo no MySQL
A necessidade é a seguinte: Preciso pegar o id anterior e o próximo id de certo registro em questão; necessário em um blog, por exemplo. Infelizmente não existem no MySQL as funções NEXT() e PREV()… Poderiam existir não é?
Mas, não existindo, me obrigou a pesquisar. Não encontrando nada de bom por aí, me obrigou a pensar e encontrei a solução, utilizando subquerys. Considerando que 2 é o id atual em questão, fica assim:
SELECT * FROM tabela WHERE id = 2 OR id = (SELECT MAX(id) FROM tabela WHERE id < 2) OR id = (SELECT MIN(id) FROM tabela WHERE id > 2)
No caso de serem ids sequenciais, o retorno seriam os dados cujo ids fossem 1, 2 e 3. Se por exemplo o id 3 tivesse sido excluído, o retorno então seria 1, 2 e 4… E assim por diante.
Foi útil para você?

Muito bom.
Se eu precisar (e algo me diz que vou) já sei onde encontrar
Cara você me salvou!
Muito obrigado e ate mais.
Fico feliz!!!
Abraço e sucesso…
Olá amigo! Preciso, além do id (no meu caso $cdfoto), passar a variável $cdgal para a página… veja se fiz da forma correta:
$query = “SELECT * FROM foto WHERE cdfoto = 2 AND cdgal=$cdgal OR cdfoto = (SELECT MAX(cdfoto) FROM foto WHERE cdfoto 2 AND cdgal=$cdgal)”;
Agora a pergunta… como defino as variáveis “anterior” e “próximo”?
Olá Jeferson! Verifica se isto resolve teu problema:
Abraço!
Poderia fazer assim também:
SELECT * FROM tabela t WHERE id = 2 OR id = (SELECT MAX(id) FROM tabela WHERE id t.id)
Tem certeza que isso funciona Filipi???
Pra mim não fez sentido algum hehe
Por acaso você teve problema em postar sua query?
Abraço!
Funciona sim, só joguei a query ali para ser sincero hahaha.
É que assim, como estamos colocando no WHERE da tabela t o campo id = 2, subentende-se que o campo t.id será igual a 2, assim não precisamos repetir o número na subquery.
Conseguimos evitar falhas humanas com isso também, pois reutilizamos o campo id do primeiro select em todas as consultas dessa query.
Oi Filipi… Eu acredito que o que você pensou funciona sim… Mas acho que aconteceu algo no comentário do WordPress… Se você copiar sua query e executá-la vai notar que está com erro de sintaxe…
Veja em http://thiagobfiorenza.wordpress.com/2011/03/29/buscar-registro-anterior-e-proximo-no-mysql/#comment-55 como resolver este problema…
Abraço!
Vamos ver se agora funciona.
SELECT id, (SELECT MAX(id) FROM tabela WHERE id < t.id) AS maior, (SELECT MIN(id) FROM tabela WHERE id > t.id) AS menor FROM tabela t HAVING id = 2 OR id = maior OR id = menorAgora apareceu!!! \o/
É uma ótima solução também!!!
Abraço, e obrigado pelo empenho ;D
Eu tenho um select melhor:
SELECT
atual.id,
(SELECT MAX(id) FROM imoveis AS anterior WHERE anterior.id atual.id) AS IDproximo
FROM
imoveis AS atual
Abraço
Não sei porque mas não consegui postar a query completa, como uso a tag para SQL?
*Obs: Substituir parênteses () por colchetes []. Tive que usar diferente para não converter a sintaxe. Continuando…
Você deve escrever seu código entre as seguintes tags.
Para código SQL:
(source language=”sql”)(/source)
Para código PHP:
(source language=”php”)(/source)
O plugin aceita todas estas linguagens:
http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/
Mande-me sua query agora ;D
Abraços!
Tu frequenta seu blog hein?
"SELECT *, (SELECT MAX(id) FROM imoveis AS anterior WHERE anterior.id < atual.id AND ativo = '1') AS IDanterior,
(SELECT MIN(id) FROM imoveis AS proximo WHERE proximo.id > atual.id AND ativo = '1') AS IDproximo FROM imoveis AS atual WHERE ativo = '1'"
Abraços… Nem lembro se era isso, só li a query anterior que postei e procurei em um dos meus ultimos trabalhos.
É… Não funcionou também… Desisto!! hehehehehe
Valeu!