Ir ao conteúdo

Outro SQL próximo e anterior, uma consulta ou duas?


Ir à solução Resolvido por Samada Kawada,

Posts recomendados

Postado

Bom, gostaria de saber se é possível resolver tudo com uma unica consulta ou teria que realizar 2 e se existe uma forma mais eficaz do que fazer uma soma e procurar pelo where (WHERE episode_id > atual.episode_id e WHERE episode_id < atual.episode_id)

Não sei se deu para entender... porém bom... Na tabela esta assim:

edDyXbv.png

O que eu gostaria de realizar é tipo, se existe episodio além do atual pegar o id dele e se existe um anterior também pega-lo...

atualmente estou a usar 

SELECT a.anime_id,title,vídeo,temporada,episodio,eps.data FROM episodes eps JOIN anime a ON a.anime_id = eps.anime_id WHERE episode_id = ${ep_id};

onde pego o episodio definido no $_GET, gostaria de saber se tem como eu colocar o próximo e o anterior direto nessa consulta ou tenho que fazer um outro SELECT para usar o where > e < e se esses tem que ser individual ou já tem como pegar tudo junto

Postado

Qual banco de dados você esta usando? No Oracle, no SQL Server e no MySql sei tem as funções de "janela" "lead" e "lag"

seria algo assim: Lag(episodio) over (partition by anime_id order by episodio) /* pega o episodio anterior. se não tiver retorna nulo */

                            lead(episodio) over (partition by anime_id order by episodio) /* pega o proximo episodio se não tiver retorna nulo */

 

 

  • Amei 1
Postado

@Samada Kawada MariaDB (MySQL)

Detalhe que como é temporada e episodio... fica acho que meio difícil usar somente episodio, na questão...

Seria para obter o episode_id se houver próximo na mesma temporada ou se houver na próxima temporada (Ainda que se não for possível, me contentaria em usar somente o próximo da mesma temporada)

 

Até tentei usar aqui porém sempre retornou null de todo jeito que tentei (Pelo que entendi da utilização) será que é pelo WHERE ou não há relação ?

  • Solução
Postado

O "where" deve ser feito depois. Segue um exemplo usando SQL Server

create table episodes
(episode_id int,
anime_id int,
episodio int,
temporada int,
vídeo varchar(200)
);

insert into episodes(episode_id,anime_id,episodio,temporada,vídeo) values(1,1,1,1, 'link anime 1 ep 1');
insert into episodes(episode_id,anime_id,episodio,temporada,vídeo) values(2,1,2,1, 'link anime 1 ep 2');
insert into episodes(episode_id,anime_id,episodio,temporada,vídeo) values(3,2,1,1, 'link anime 2 ep 1');
insert into episodes(episode_id,anime_id,episodio,temporada,vídeo) values(4,2,2,1, 'link anime 2 ep 2');

select * from (
SELECT eps.episode_id, eps.anime_id, eps.episodio, eps.temporada
,vídeo as link_atual
,lag(vídeo,1,'')  over(partition by eps.anime_id, eps.temporada order by eps.episodio asc) as link_anterior
,lead(vídeo,1,'') over(partition by eps.anime_id, eps.temporada order by eps.episodio asc) as link_proximo
FROM episodes eps 
  ) s
where s.episode_id=3

 

sqlfiddle

  • Obrigado 1
Postado

@Samada Kawada Para a próxima temporada não deu porém já está passado de bom =D

 

Usei desta maneira e funcionou perfeitamente:

select * from (
SELECT eps.episode_id, eps.anime_id, eps.episodio, eps.temporada,vídeo as link_atual
,lag(episode_id,1)  over(partition by eps.anime_id, eps.temporada order by eps.episodio asc) as link_anterior
,lead(episode_id,1) over(partition by eps.anime_id, eps.temporada order by eps.episodio asc) as link_proximo
FROM episodes eps 
  ) s where s.episode_id=3;

 

Muito obrigado ^^, mais para frente quem sabe não aprendo a fazer para as próximas temporadas se é que isso é possível 

Postado

Basta remover a temporada da partição e colocar na ordenação

de 

lead(episode_id,1) over(partition by eps.anime_id, eps.temporada order by eps.episodio asc) as link_proximo

Para

lead(episode_id,1) over(partition by eps.anime_id order by eps.temporada, eps.episodio asc) as link_proximo

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...