Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
Pensei em usar subqueries, mas ainda não consegui desenvolver o raciocínio sobre como buscar...
Tem alguma idéia?
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.
Eu nunca trabalhei com oracle, mas buscando na web só achei que não existe nada similar a ROWNUM para mysql.
Certo, mas eu ainda não entendi bem o conceito dele.
Você poderia explicar um pouco como funciona?
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) TSELECT T.*,ROWNUM SEQ
FROM (select @rownum:=@rownum+1 ‘rownum’, p.* from player p, (SELECT @rownum:=0) r order by score) TO 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.
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.
Hummm, nem pensei no UNION, me parece que vai funcioanr, bem simples essa solução
Valeu!
Já tentou utilizar subselects?