Mirth 0 Denunciar post Postado Maio 28, 2008 ola, eu tenho a seguinte query para calcular o numero de votos (positivos + negativos): SELECT videos.*, count(videoid) as votescount FROM videos Inner Join login ON login.id = videos.postedby Left Join votevideos ON votevideos.videoid = videos.id GROUP BY videos.id ORDER BY votescount DESC LIMIT 0, 7 É possivel eu separar os votos por "positivos" e "negativos" na mesma query? (os positivos têm valor 1 e os negativos valor 0 e pertencem à coluna "vote") obrigado pela ajuda.. Compartilhar este post Link para o post Compartilhar em outros sites
Paulo Caesar 0 Denunciar post Postado Maio 28, 2008 Pra determinar se o voto é positivo ou negativo, você tem algo que diferencia eles não? Tipo uma coluna enum (pos,neg)? Porque daí ficaria fácil: Imaginando que sua tabela votevideos tenha, videoid, userid, tipo SELECT `videos`.*, COUNT(`videoid`) AS `votescount`, #TOTAL SUM(IF(`tipo` = 'pos', 1, 0)) AS `positivos`, SUM(IF(`tipo` = 'neg', 1, 0)) AS `negativos` ... Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Maio 28, 2008 da forma do Paulo eu não conheço, mas pode fazer assim select video.*, sum(case when vote = 1 then 1 else 0 end) Positivo, sum(case when vote = 0 then 1 else 0 end) Negativo from video Inner Join login ON login.id = videos.postedby Left Join votevideos ON votevideos.videoid = videos.id GROUP BY videos.id ORDER BY votescount DESC LIMIT 0, 7 Compartilhar este post Link para o post Compartilhar em outros sites
Mirth 0 Denunciar post Postado Maio 28, 2008 ola,as duas formas funcionam, muito obrigado, acabei por usar a função case porque percebi melhor a estrutura.. agora queria somar as duas colunas e não está a dar, qual o meu erro?: SELECT videos.*, sum(case when vote = 1 then 1 else 0 end) as Positivo, sum(case when vote = 0 then 1 else 0 end) as Negativo, (Positivo - Negativo) as total from videos Inner Join login ON login.id = videos.postedby Left Join votevideos ON votevideos.videoid = videos.id GROUP BY videos.id ORDER BY total DESC LIMIT 0, 7 Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Maio 28, 2008 na consulta não se usa o alias para função, usa os sum SELECT videos.*, sum(case when vote = 1 then 1 else 0 end) as Positivo, sum(case when vote = 0 then 1 else 0 end) as Negativo, (sum(case when vote = 1 then 1 else 0 end) - sum(case when vote = 0 then 1 else 0 end) ) as total from videos Inner Join login ON login.id = videos.postedby Left Join votevideos ON votevideos.videoid = videos.id GROUP BY videos.id ORDER BY total DESC LIMIT 0, 7 Compartilhar este post Link para o post Compartilhar em outros sites
Paulo Caesar 0 Denunciar post Postado Maio 28, 2008 O MYSQL não aceita você somar 'aliases', a não ser na parte do "HAVING". Você teria que fazer: SELECT sum(case when `vote` = 1 then 1 else 0 end)-sum(case when `vote` = 0 then 1 else 0 end) AS `total` Compartilhar este post Link para o post Compartilhar em outros sites
Mirth 0 Denunciar post Postado Maio 28, 2008 Obrigado, eu pensava que podia usar as labels Positivo e Negativo.. Obrigado gente, valeu Compartilhar este post Link para o post Compartilhar em outros sites