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 https://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.
Agora apareceu!!! \o/
É uma ótima solução também!!!
Abraço, e obrigado pelo empenho ;D
Ola desenterrando o Post rsrs …
queria saber como faço para pegar o proximo e anterior soh que nesse caso eu tenho a tabela com os registros e listo eles com alguns sendo destaque e depois o restante . usei o codigo do Filipe e deu certo porem .. tenho registros q sao tipo id 15 outro 50 que estao marcados como destaque como faço pra eles ficarem na sequencia e depois vir normal os outros resultados?
rsrs n sei se ficou claro !! rsrs
(source language=”sql”)(/source)
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!
assim também funciona, e é mais simples:
anterior:
SELECT * FROM tabela WHERE id < 2 ORDER BY id DESC LIMIT 1
proximo:
SELECT * FROM tabela WHERE id > 2 ORDER BY id ASC LIMIT 1
Olá Thiago!
Muito instrutivo o seu blog! Parabéns!
Estou precisando de orientação da seguinte forma, eu tenho que fazer um cálculo (PHP com MYSQL) em uma determinada tabela que contem
data km (dados hipotéticos)
01/03/2012 50
05/03/2012 89,4
10/03/2012 133,6
15/03/2012 190,2
Preciso que sejam visualizados da seguinte forma:
Data km_inicial km_final
05/03/2012 50 89,4
10/03/2012 89,4 133,6
15/03/2012 133,6 190,2
Como eu poderia fazer isso? Poderia me ajudar?
Desde já agradeço!
Adorei a instrução. Muito mais do que útil.
Estou com um problema, no próximo, ele está pegando sempre o último e não o próximo. O que pode ser?
“SELECT * FROM ger_portfolio WHERE id_portfolio = ‘$idAqui’ OR id_portfolio = (SELECT MAX(id_portfolio) FROM ger_portfolio WHERE id_portfolio ‘$idAqui’)”;
Consegui fazer no PDO orientado a objeto… rodou 100%… grato
Massa! Precisei usar pra fazer um sisteminha e rodou show de bola!
Obrigado por compartilhar conosco!!
prepare(‘SELECT tipo,categoria,id,titulo FROM post WHERE ‘.$string_url_type_nId.’ ORDER BY id ASC’);
$f->bindParam(‘:curso’,$a);
$f->bindParam(‘:cat’,$b);
$g = false;
$h = null;
$post_anterior = null;
if ($f->execute()) {
if ($f->rowCount() > 0 ) {
$g = true;
$sql_count = 4;
$h = $f->fetchAll();
$a_ = 0;
$b_ = 1000;
while ( $a_ < $b_ ) {
// se não existir, para o loop
if ( ! isset( $h[$a_][2] ) ) {
break;
}
// post atual
if ( $h[$a_][2] == $c ) {
// post anterior
if ( isset ( $h[$a_ – 1][2] ) )
for ($c_ = 0; $c_
<a href="”>
Esse é o primeiro post 🙂
Para usar o proximo post e o mesmo esquema de cima, usando explode.
CODIGO DE CIMA TA AQUI ->
http://codepad.org/8fCOffus . boa sorte 🙂
af q saco kk -> esse ta completinho http://codepad.org/Gbc4l2b8