Pergunta

Eu tenho uma consulta MySQL assim:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;

Eu quero restringir os resultados para linhas onde Ocorrências> 0. Isso parece muito simples para mim, mas eu não consigo fazê-lo funcionar. Não importa o que eu tente, WHERES ou posses, sempre que tento adicionar essa restrição eu recebo nenhuma linha em troca. Tenho certeza de que há dados na minha mesa que devem ser devolvidos. Alguém sabe como realizar o que estou fazendo?


Eu tentei isso, mas ainda não funciona. Alguma idéia por que ele ainda não vai funcionar?

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" HAVING SUM(...some SQL removed for brevety)>0 GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
Foi útil?

Solução

Eu não sou tão familiarizado com o MySQL como estou com o SQL Server, mas em T-SQL, você não pode usar aliases nas cláusulas GROUP BY (eu pensava ORDER BY cláusulas bem, mas que desde então tem se mostrado estar incorrecta). Neste caso, você quer filtrar com base nos resultados de um GROUP BY, então eu usaria uma cláusula HAVING da seguinte forma:

SELECT *, SUM(... some SQL removed for brevity ...) AS Occurrences
FROM
    some_table AS q
WHERE
    criterion = 'value'
GROUP BY
    q.P_id
HAVING
    SUM(... some SQL removed for brevity ...) > 0
ORDER BY
    Occurrences DESC
LIMIT 10;

Outras dicas

Esta consulta funciona para mim ...

select order_id, sum(qty_ordered) as total_qty 
from sales_flat_order_item 
group by order_id 
having total_qty > 10
order by total_qty desc

Ah, eu encontrei o lugar para ele.

A afirmação é agora:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id HAVING SUM(...some SQL removed for brevety)>0 ORDER BY Occurrences DESC LIMIT 10;

Parece estar funcionando bem com ORDER BY Ocorrências,

Eu acredito que os agregados devem estar na cláusula HAVING. Embora, na verdade, eu não tenho certeza se aliases são aceitos.

HAVING (Occurrences > 0)

HAVING (SUM(...some SQL removed for brevety) > 0)

Como alternativa, você pode usar uma sub-consulta:

SELECT *
FROM (
   -- your current query
) AS sub
WHERE (Occurences > 0)

De acordo com o padrão SQL, os aliases de coluna não estão disponíveis no corpo da consulta, que é um incômodo confundidos. Dado o que você já tentou, soa como se o mesmo é verdade para MySQL (e alguns outros DBMS). Você provavelmente vai ter que repetir a expressão na cláusula ORDER BY.

Além disso, a cláusula GROUP BY deve listar cada coluna que está no *, e não apenas a chave primária (embora, logicamente, especificando a chave primária deve ser suficiente).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top