Digamos que tenho registros com IDs 3,4,7,9 e desejo poder ir de um para outro navegando nos links seguintes / anteriores. O problema é que eu não sei como buscar registros com o ID mais alto mais próximo.
Portanto, quando tenho um registro com o ID 4, preciso buscar o próximo registro existente, que seria 7. A consulta provavelmente se parecerá com algo como
SELECT * FROM foo WHERE id = 4 OFFSET 1
Como posso buscar o registro seguinte / anterior sem buscar todo o conjunto de resultados e iterar manualmente?
Estou usando o MySQL 5.
Respostas:
Próximo:
anterior:
fonte
Além dos cemkalyoncu's solução :
próximo registro:
Registro anterior:
edit: Como essa resposta tem recebido alguns votos positivos recentemente, quero enfatizar o comentário que fiz anteriormente sobre o entendimento de que uma coluna de chave primária não se destina a ser uma coluna a ser classificada, porque o MySQL não garante esse aumento automático maior , os valores são necessariamente adicionados posteriormente.
Se você não se importa com isso, e simplesmente precisa do registro com um valor mais alto (ou mais baixo)
id
, isso será suficiente. Apenas não use isso como um meio para determinar se um registro é realmente adicionado mais tarde (ou mais cedo). Em vez disso, considere usar uma coluna datetime para classificar por, por exemplo.fonte
Todas as soluções acima requerem duas chamadas ao banco de dados. O código sql abaixo combina duas instruções sql em uma.
fonte
DISTINCT
antes*
tornará ainda melhor, ou seja, é claro queid
pode ter0
como valor.id
ao invés de dois.fonte
SELECT * FROM foo WHERE id<4 ORDER BY id DESC LIMIT 1
para o registro anteriorEu estava tentando fazer algo semelhante a isso, mas precisava dos resultados ordenados por data, pois não posso confiar no campo de ID como uma coluna classificável. Aqui está a solução que eu criei.
Primeiro, descobrimos o índice do registro desejado na tabela, quando ele é classificado como queremos:
Em seguida, diminua o resultado em 2 e coloque-o na declaração de limite. Por exemplo, o acima retornou 21 para mim, então eu corro:
Fornece seu registro primário, juntamente com os registros seguintes e anteriores, de acordo com o pedido declarado.
Tentei fazer isso como uma única chamada de banco de dados, mas não consegui que a instrução LIMIT recebesse uma variável como um de seus parâmetros.
fonte
Tente este exemplo.
Nota: Se o valor não for encontrado, ele retornará nulo .
No exemplo acima, o valor Anterior será Raja e o valor Próximo será nulo porque não há próximo valor.
fonte
Usando a abordagem do @Dan, você pode criar JOINs. Basta usar uma variável @ diferente para cada subconsulta.
fonte
current
->current_row
&previous
->previous_row
.Próxima linha
Linha anterior
amostra da próxima linha
amostra da linha anterior
fonte
Eu tinha o mesmo problema que Dan, então usei sua resposta e a melhorei.
Primeiro selecione o índice da linha, nada de diferente aqui.
Agora use duas consultas separadas. Por exemplo, se o índice da linha for 21, a consulta para selecionar o próximo registro será:
Para selecionar o registro anterior, use esta consulta:
Lembre-se de que, para a primeira linha (o índice da linha é 1), o limite será -1 e você receberá um erro do MySQL. Você pode usar uma instrução if para evitar isso. Apenas não selecione nada, pois não há registro anterior. No caso do último registro, haverá a próxima linha e, portanto, não haverá resultado.
Lembre-se também de que, se você usar DESC para fazer pedidos, em vez de ASC, as consultas para selecionar as linhas seguinte e anterior ainda serão as mesmas, mas alternadas.
fonte
Esta é uma solução universal para condições com mais resultados iguais.
fonte
Aqui temos uma maneira de buscar registros anteriores e seguintes usando uma única consulta MySQL. Onde 5 é o ID do registro atual.
fonte
Como obter o registro seguinte / anterior no MySQL e PHP?
Meu exemplo é obter apenas o ID
fonte
Otimizando a abordagem @Don para usar apenas uma consulta
altere CurrentArticleID com o ID atual do artigo, como
fonte
Há outro truque que você pode usar para mostrar as colunas das linhas anteriores, usando qualquer ordem que desejar, usando uma variável semelhante ao truque @row:
Aparentemente, as colunas de seleção são avaliadas em ordem, portanto, primeiro você seleciona as variáveis salvas e depois atualiza as variáveis para a nova linha (selecionando-as no processo).
NB: Não tenho certeza se esse é um comportamento definido, mas eu o usei e funciona.
fonte
Se você deseja alimentar mais de um
id
na sua consulta e obternext_id
todos eles ...Atribua
cur_id
seu campo de seleção e alimente-o para que a subconsulta chegue aonext_id
campo de seleção. E então selecione apenasnext_id
.Usando longneck reply para calc
next_id
:fonte
fonte
Se você tiver uma coluna de índice, digamos id, poderá retornar o ID anterior e o próximo em uma solicitação sql. Substitua: id pelo seu valor
fonte
Minha solução para obter o próximo registro e visualizar também para voltar ao primeiro registro, se eu estiver na última e vice-versa
Não estou usando o ID, estou usando o título para URLs agradáveis
Estou usando o Codeigniter HMVC
fonte
Aqui está a minha resposta. Pego uma ideia no ' Decent Dabbler ' e adiciono a parte que está verificando se o id está entre min (id) e max (id). Aqui está a parte para criar minha tabela.
);
A próxima etapa é criar um procedimento armazenado responsável por obter o ID anterior.
O primeiro método é bom se os índices estiverem classificados, mas se não estiverem. Por exemplo, se você possui índices: 1,2,7 e precisa obter o número 2 do índice dessa maneira, muito melhor para usar outra abordagem.
fonte
100% trabalhando
fonte
Eu acho que para ter a linha real seguinte ou anterior na tabela SQL, precisamos do valor real com igual, (<ou>) retorne mais de um, se você precisar alterar a posição da linha em uma tabela de pedidos.
precisamos do valor
$position
para pesquisar aneighbours
linha Na minha tabela, criei uma coluna 'position'e consulta SQL para obter a linha necessária é:
a seguir :
para anterior:
fonte
Selecione o top 1 * de foo em que id> 4 ordena por id asc
fonte
select * from foo where id>4 order by id asc LIMIT 1