Ir para conteúdo

POWERED BY:

Arquivado

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

hideout

[Resolvido] Dificuldade com JOIN

Recommended Posts

Pessoal é a primeira vez que estou fazendo buscas mais complexas, já li sobre joins e obtive sucesso em algums delas. Mas tem uma que estou com dificuldades.

 

Originalmente a consulta envolve varias tabelas, mais simplifiquei somente com as 2 que estou tendo problema.

 

A consulta que estou fazendo, são quais os vídeos mais comentados.

 

Tabelas:

videos
comentarios

A tabela comentario pode ter ou não um registro de um determinado vídeo. As colunas para identificar um vídeo na tabela comentario são:

video_id
componente

 

A consulta que faço:

 

SELECT v.id_video, v.titulo, v.duracao
FROM videos v 
RIGHT OUTER JOIN comentarios c ON c.video_id = v.id_video
WHERE v.video_ativo = '1' AND v.categoria_video = '1'
GROUP by c.video_id
ORDER BY sum(c.publicado) DESC;

O problema é que preciso que na tabela comentario a coluna componente seja = 'com_tv', mas não sei como comparar, pois se colocar um AND aparece somente os vídeo que tem comentario. E eu quero a listagem de todos os vídeos mais com ordem dos mais comentados, mesmo aqueles que não foram.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) Como é feito outer join e também uma comparação

WHERE v.video_ativo = '1' AND v.categoria_video = '1'
os resultados do outer join virão com nulo e não serão filtrados pela condição passada, uma solução : use uma função que trate nulos como coalesce.

 

2) Para ordenar pelas strings que contenham uma determinado valor você pode usar o case

... ORDER BY (CASE WHEN CAMPO1 LIKE '%XPTO%' THEN 1 ELSE 0 END) ...

 

Não conheco MySql, talvez existam funções mais prática para isto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi, troquei o RIGHT pelo LEFT JOIN, adicionei um AND no final do JOIN e agrupei pelo id do vídeo;

 

SELECT v.id_video, v.titulo, v.duracao
FROM videos v 
LEFT OUTER JOIN comentarios c ON c.video_id = v.id_video AND c.componente = 'com_tv' 
WHERE v.video_ativo = '1' AND v.categoria_video = '1'
GROUP by v.id_video
ORDER BY sum(c.publicado) DESC;

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.