Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

stview

[Resolvido] Como buscar 5 registros antes e depois de um ID tal?

Recommended Posts

Estou tentando criar uma visualização semelhante a que o flickr e outros sites utilizam:

Quando estou vendo uma foto, mantenho uma lista com mais fotos ao lado numa "galeria", e a foto atual sempre fica no meio da listagem, com 2 ou 3 pra cada lado.

 

Mas estou tentando fazer essa consulta no banco e não estou conseguindo.

Exemplo:

Tenho os ids: 1, 2, 3, 10, 11, 12, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30.

O id atual é o 21, e quermo mostrar 5 pra cada lado, logo preciso montar um select que me retorne os ids: 2,3,10,11,12,21,22,23,24,25,26

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensei em usar subqueries, mas ainda não consegui desenvolver o raciocínio sobre como buscar...

Tem alguma idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma solução para Oracle (que talvez possa ser adaptada)

 

SELECT B.*
FROM
(
SELECT T.*,ROWNUM SEQ
FROM   TABELA T
) A,
(
SELECT T.*,ROWNUM SEQ
FROM   TABELA T
) B
WHERE (A.ID = '21' AND  B.SEQ BETWEEN A.SEQ-2 AND A.SEQ+2)

ROWNUM é uma pseudocoluna que numera sequenciamente o result set.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu nunca trabalhei com oracle, mas buscando na web só achei que não existe nada similar a ROWNUM para mysql.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, mas eu ainda não entendi bem o conceito dele.

Você poderia explicar um pouco como funciona?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não manjo MySql mas faça a ideia do cara

 

select @rownum:=@rownum+1 ‘rank’, p.* from player p, (SELECT @rownum:=0) r order by score desc limit 10;
ou como uma view, ou como uma tabela.

 

+ou- isto ...

 


SELECT B.*
FROM
(
SELECT T.*,ROWNUM SEQ
FROM   (select @rownum:=@rownum+1 ‘rownum’, p.* from player p, (SELECT @rownum:=0) r order by score) T
) A,
(
SELECT T.*,ROWNUM SEQ
FROM   (select @rownum:=@rownum+1 ‘rownum’, p.* from player p, (SELECT @rownum:=0) r order by score) T
) B
WHERE (A.ID = '21' AND  B.SEQ BETWEEN A.SEQ-2 AND A.SEQ+2)

O rownum no Oracle é uma pseudocoluna que monta um sequencial das linhas do resultado, muito útil em alguns casos.

 

Pelo que vi MySql não tem nada parecido, mas aquelas soluções simulam o rownum.

 

Mas não perca o foco, talvez exista uma outra solução para o problema original (listar o intervalo) via MySql.

Compartilhar este post


Link para o post
Compartilhar em outros sites

trabalho com oracle e mysql.

 

no mysql usa-se a instrução LIMIT e dependendo do caso tb usa a função COUNT()

 

no caso do autor do tópico é relativamente simples segundoo que entendi

 

 

SELECT 
   id
FROM
   table
WHERE 
   id = 21

query simples que retornará o row do registro cujo id é 21

 

 

agora, como extrair os 5 registros anteriores ao id 21, comparando-se o id e retornando sob mesma consulta ?

 

 

SELECT 
   id
FROM
   table
WHERE 
   id <= 21
LIMIT 6

LIMIT 6 -> limitará a consulta até 6 resultados ( six rows ). Ou seja, o id 21 + 5 rows anteriores, condicionados por "WHERE id <= 21"

 

 

como obter os registros posteriores ao id 21 ?

 

mantendo a mesma query acima, adicione "UNION"

 

SELECT 
   id
FROM
   table
WHERE 
   id <= 21
LIMIT 6

UNION

SELECT 
   id
FROM
   table
WHERE 
   id > 21
LIMIT 11

LIMIT 11 -> deve ser 11 porque é somatizado a quantidade de rows da consulta da query anterior, logo, 6 + 5 = 11.

Ao total devem retornar no máximo 11 rows.

 

 

há outras formas de fazer isso, mas por aí você já pode ter uma base.

 

espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.