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ê?

17 comentários até agora

  1. Marcelo on

    Muito bom.
    Se eu precisar (e algo me diz que vou) já sei onde encontrar ;)

  2. Lucas1 on

    Cara você me salvou!

    Muito obrigado e ate mais.

  3. Jeferson on

    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”?

    • thiagobfiorenza on

      Olá Jeferson! Verifica se isto resolve teu problema:

      $query = “SELECT * FROM foto WHERE cdgal=$cdgal AND (cdfoto = 2 OR cdfoto = (SELECT MAX(cdfoto) FROM foto WHERE cdfoto < 2) OR cdfoto = (SELECT MIN(cdfoto) FROM foto WHERE cdfoto > 2))”;

      Abraço!

      • Filipi Santana de Assis on

        Poderia fazer assim também:

        SELECT * FROM tabela t WHERE id = 2 OR id = (SELECT MAX(id) FROM tabela WHERE id t.id)

        • thiagobfiorenza on

          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!

          • Filipi Santana de Assis on

            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.

  4. willwalker on

    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

    • willwalker on

      Não sei porque mas não consegui postar a query completa, como uso a tag para SQL?

      • thiagobfiorenza on

        *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!

        • Walker Sousa on

          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.

  5. Thiago on

    Valeu!


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.