Comment puis-je faire deux condition dans la clause having
J'ai un tableau similaire:
domain | file | Number
------------------------------------
aaa.com | aaa.com_1 | 111
bbb.com | bbb.com_1 | 222
ccc.com | ccc.com_2 | 111
ddd.com | ddd.com_1 | 222
eee.com | eee.com_1 | 333
J'ai besoin d'interroger le nombre de Domains
qui partagent le même Number
et leur File
le nom se termine par _1
. J'ai essayé le suivant:
select count(domain) as 'sum domains', file
from table
group by Number
having
count(Number) >1 and File like '%\_1';
Il me donne:
sum domains | file
------------------------------
2 | aaa.com
2 | bbb.com
J'attend de voir la suite:
sum domains | file
------------------------------
1 | aaa.com
2 | bbb.com
Parce que le Number
111 apparaît une fois avec File
se termine avec _1
et _2
, donc il faut compter 1 seulement. Comment puis-je appliquer les 2 conditions que j'ai dit plus tôt correctement ?
MySQL est libre de choisir n'importe quelle valeur de non-agrégées colonnes dans chaque groupe, de sorte que la valeur sélectionnée pour
Comme vous l'avez dit, la valeur sélectionnée de la
Eh bien, mon commentaire était vraiment destiné à souligner que l'objectif de votre demande n'est pas claire. Si la valeur renvoyée pour
Vous êtes de droite. le
Voulez-vous ces
file
est indéterminée. Votre résultat attendu affiche un nombre de 2 contre bbb.com
- mais il y a un seul bbb.com
domaine/fichier dans votre table - pourquoi pensez-vous que file
valeur dans le second groupe (qui a sans doute Number=222
) et non pas, par exemple, ddd.com
?Comme vous l'avez dit, la valeur sélectionnée de la
file
est indéterminé. J'ai mis bbb.com
à titre d'exemple. Mais le problème n'est pas dans le file
. mon problème dans le sum domains
. Mon compte de résultat de la requête compte le nombre de fichiers qui ne se terminent pas avec _1
, dont je ne veux pas et j'ai mis une condition dans le having
clause, mais il semble qu'il y ait quelque chose de mal.Eh bien, mon commentaire était vraiment destiné à souligner que l'objectif de votre demande n'est pas claire. Si la valeur renvoyée pour
file
est sans importance pour vous, pourquoi choisir? C'est plus normal pour sélectionner la colonne(s) sur lequel on a regroupé les résultats: c'est à dire Number
dans ce cas. Pour répondre à votre question, il semble que vous probablement l'intention pour le filtre à file
avant le regroupement - c'est à dire dans un WHERE
clause plutôt que dans le HAVING
clause (qui est effectuée sur les résultats regroupés, après l'agrégation comme COUNT(*)
a déjà été effectué).Vous êtes de droite. le
file
est une sorte de sens. Il est plus utile d'utiliser le "Numéro". Si j'ai utilisé where' for to filter files wich ends with
_1, then how can I add another condition which is that the
Nombre " est apparu plus d'une fois. j'.e, j'ai besoin d'interroger le nombre de fichiers dans File
avec _1
et de partager la même Number
.Voulez-vous ces
Number
s qui ont plus d'un file
se terminant avec 1
, ou ceux NUmber
s qui ont plus d'un enregistrement d'au moins une qui se termine dans 1
?OriginalL'auteur user1810868 | 2012-12-15
Vous devez vous connecter pour publier un commentaire.
Comme indiqué sous
SELECT
Syntaxe:En d'autres termes, il est appliqué après l'opération de regroupement a été effectué (en contraste avec
WHERE
, qui est effectuée avant toute opération de regroupement). Voir OÙ vs AVOIR.Par conséquent, votre requête doit en premier lieu le jeu de résultats suivants:
Voir sur sqlfiddle:
Comme vous pouvez le voir, les valeurs sélectionnées pour le
file
colonne sont simplement l'une des valeurs de chaque groupe—comme indiqué sous Extensions MySQLGROUP BY
:Votre requête actuelle procède ensuite à filtrer ces résultats en fonction de votre
HAVING
clause:Avec les valeurs de
file
sélectionné ci-dessus, tous les matches de groupe sur le second critère; et les deux premiers groupes de match sur le premier critère. Par conséquent, les résultats de la requête complète sont:Suivantes votre commentaires ci-dessus, vous souhaitez filtrer les enregistrements sur
file
avant regroupement et ensuite filtrer les groupes résultant pour ceux contenant plus d'un match. Par conséquent, l'utilisationWHERE
etHAVING
respectivement (et sélectionnezNumber
au lieu defile
pour identifier chaque groupe):Voir sur sqlfiddle:
OriginalL'auteur eggyal
Essayez la requête imbriquée ci-dessous:
J'ai utilisé le fichier dans la clause where. Mis à jour pour utiliser de domaine. Essayez-le maintenant. Utiliser le bon nom de la table dans la requête.
Il n'est pas venu. Le fichier est le champ qui contient
_1
.Correction de la requête. Veuillez s'il vous plaît laissez-moi savoir.
OriginalL'auteur Yogendra Singh
Vous ne pouvez pas avoir le nom de fichier dans la
SELECT
déclaration si elle n'est pas dans leGROUP BY
. Vous devez obtenir votreGROUP BY
résultat queJOIN
en arrière à l'original et ajouter la logique de filtre comme suit:OriginalL'auteur Julie Kalu
je suis en utilisant par la suite
OriginalL'auteur Ahmed Awan