Ir para conteúdo

POWERED BY:

Arquivado

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

Mirth

soma de valores de 2 consultas em mysql

Recommended Posts

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.