2010-11-10 2 views
1

Je rencontre des problèmes avec cette requête SQL. Mon objectif est de récupérer les ContactID des contacts qui vivent en CT ou MA et qui ont eu plus de 2 événements.Filtrage de requêtes SQL COUNT sans utiliser HAVING

Voici la requête que je suis en train d'utiliser:

SELECT `Contacts`.`ContactID` 
FROM (`Contacts`) 
JOIN `Events` ON `Contacts`.`ContactID` = `Events`.`ContactID` 
JOIN `Contact_Addresses` ON `Contacts`.`ContactID` = `Contact_Addresses`.`ContactID` 
WHERE `Contact_Addresses`.`State` IN ('CT', 'MA') AND COUNT(Events.EventID) > 2 

Je sais que je pourrais utiliser le groupe par déclaration HAVING. Comme si:

...WHERE `Contact_Addresses`.`State` IN ('CT', 'MA') 
HAVING COUNT(Events.EventID) > 2 

Mais cela ne me donne pas les résultats corrects que je recherche. Je sais que je suis proche, je pense que j'ai besoin d'une sous-requête ajoutée? Toute orientation dans la direction que je devrais aller serait une aide énorme.

Répondre

1

Vous devez utiliser une GROUP BY clause ainsi, sinon COUNT(Events.EventID) sera de retour 1 dans tous les cas:

SELECT ... 
FROM ... 
JOIN .... 
WHERE ... 
GROUP BY Events.ContactID 

Vous avez seulement besoin d'utiliser des accents graves sur vos noms si elles se trouvent un mot réservé, fyi.

+0

Je vote parce que je suis d'accord avec le changement suggéré. Cependant, je pense que vous vous trompez dans votre explication du problème actuel. Sans un GROUP BY, la requête actuelle de l'OP ne peut renvoyer que 1 ligne au plus. (Un HAVING sans GROUP BY implique le "grand total" GROUP BY, qui renvoie une seule ligne normalement mais le HAVING peut la filtrer à 0.) –

2

... cela ne me donne pas les résultats corrects que je recherche.

Cela ne nous donne aucune idée du problème.

Utilisation:

SELECT c.contactid 
    FROM CONTACTS c 
WHERE EXISTS(SELECT NULL 
       FROM EVENTS e 
       WHERE e.contactid = c.contactid 
      GROUP BY e.eventid 
       HAVING COUNT(e.eventid) > 2) 
    AND EXISTS(SELECT NULL 
       FROM CONTACT_ADDRESSES ca 
       WHERE ca.contactid = c.contactid 
       AND ca.state IN ('CT', 'MA')) 
+0

Désolé pour la mauvaise description des résultats. Je savais que les résultats que je recevais étaient inexacts. Merci pour l'aide à la requête. – whobutsb

1

Essayez de changer votre requête:

SELECT `Contacts`.`ContactID` 
FROM (`Contacts`) 
JOIN `Events` ON `Contacts`.`ContactID` = `Events`.`ContactID` 
JOIN `Contact_Addresses` ON `Contacts`.`ContactID` = `Contact_Addresses`.`ContactID` 
WHERE `Contact_Addresses`.`State` IN ('CT', 'MA') 
GROUP BY `Contacts`.`ContactID` 
HAVING COUNT(DISTINCT Events.EventID) > 2 

Vous devez groupe sur ContactID pour compter le nombre d'événements par contact et vous devez compter distincts EventID valeurs dans le cas où un contact a plus d'une adresse dans CT ou MA.