hideout 0 Denunciar post Postado Agosto 17, 2010 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
Motta 645 Denunciar post Postado Agosto 18, 2010 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
hideout 0 Denunciar post Postado Agosto 18, 2010 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