2010-04-10 3 views
0

Existe-t-il un moyen d'utiliser la clause HAVING d'une autre manière sans utiliser group by. J'utilise des rails et voici un exemple de scénario du problème auquel je suis confronté. Dans les rails, vous pouvez utiliser la fonction Model.find (: all,: select, conditions,: group) pour obtenir des données. Dans cette requête, je peux spécifier une clause having dans le groupe: param. Mais que se passe-t-il si je n'ai pas une clause group by mais que je veux avoir une clause having dans le jeu de résultats.Rails Enregistrement actif Mysql find query Clause HAVING

Ex: permet de prendre une requête

select sum (x) en tant que a, b, c à partir de y où "groupe" de some_conditions b, c;

Cette requête a une agrégation sum() sur l'un des champs. Non s'il n'y a rien à agréger, alors mon résultat devrait être un ensemble vide. Mais mysql retourne une ligne NULL. Donc, ce problème peut être résolu en utilisant

sélectionnez somme (x) en tant que, b à partir de y où "certaines_conditions" groupe par b ayant une valeur NOT NULL;

mais que se passe-t-il si je n'ai pas de clause group by ?? une requête comme ci-dessous

Sélectionnez la somme (x) en tant que, b à partir de y où "quelques_conditions"; Donc comment spécifier que somme (x) ne devrait pas être NULL?

Toute solution qui retournerait un ensemble vide dans ce cas au lieu d'une ligne NULL aidera et cette solution devrait être réalisable dans les rails.

Nous pouvons utiliser les sous-requêtes pour obtenir cette condition de travailler avec sumthin comme celui-ci

select * from ((sélectionner somme (x) comme b de y où "some_condition") comme subq) où subq.b est non nul ;

mais y a-t-il une meilleure façon de le faire à travers sql/rails ??

Répondre

0

La sous-requête est la manière standard de gérer cette situation dans SQL. Cependant, je recommande de ne pas utiliser la sous-requête ou HAVING, et de vérifier à la place si SUM (x) est NULL. Il est préférable de toujours retourner un résultat afin de ne pas avoir à vérifier si vous en avez un ou non. Si la valeur est NULL, alors vous savez qu'il n'y avait pas d'enregistrements avec des valeurs NON NULL.

Une chose que vous n'avez pas mentionné, si vous ne voulez pas la somme (x) est nulle, alors vous pouvez le faire:

SELECT IFNULL(SUM(x), 0) AS a FROM table 
+0

@marcus adams - qui fonctionne! Merci! – meetraghu28