Question

J'ai une requête MySQL comme celle-ci:

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;

Je souhaite limiter les résultats aux lignes où Occurrences > 0. Cela me semble très simple, mais je n'arrive pas à le faire fonctionner. Peu importe ce que j'essaie, où ou après, chaque fois que j'essaie d'ajouter cette restriction, je n'obtiens AUCUN RANG. Je suis convaincu qu'il y a des données dans mon tableau qui devraient être renvoyées. Est-ce que quelqu'un sait comment accomplir ce que je fais?

J'ai essayé cela, mais ça ne marche toujours pas. Des idées pour lesquelles cela ne fonctionne toujours pas?

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;
Était-ce utile?

La solution

Je ne connais pas aussi bien MySQL que SQL Server, mais dans T-SQL, vous ne pouvez pas utiliser d'alias dans les clauses GROUP BY (je pensais aussi à l'origine aux clauses ORDER BY, mais être incorrect). Dans ce cas, vous souhaitez filtrer en fonction des résultats d'un GROUP BY. J'utiliserais donc une clause HAVING comme suit:

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;

Autres conseils

Cette requête fonctionne pour moi ...

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, j'ai trouvé la place pour ça.

La déclaration est maintenant:

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;

Cela semble fonctionner correctement avec ORDER BY Occurrences,

Je pense que les agrégats devraient figurer dans la clause HAVING. Certes, je ne suis pas sûr que les alias soient acceptés.

HAVING (Occurrences > 0)

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

Vous pouvez également utiliser une sous-requête:

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

Selon le standard SQL, les alias de colonne ne sont pas disponibles dans le corps de la requête, ce qui est une nuisance confondue. Compte tenu de ce que vous avez essayé, il semble que ce soit la même chose pour MySQL (et quelques autres SGBD). Vous devrez probablement répéter l’expression dans la clause ORDER BY.

De plus, la clause GROUP BY devrait répertorier toutes les colonnes du *, pas seulement la clé primaire (bien que, logiquement, spécifier la clé primaire devrait suffire).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top