SQL查询过滤COUNT而不使用HAVING

时间:2010-11-10 19:14:08

标签: sql mysql

我遇到了这个SQL查询的问题。我的目标是检索居住在CT或MA并且有超过2个事件的联系人的ContactID。

以下是我正在尝试使用的查询:

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

我知道我可以使用声明组HAVING。像这样:

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

但这并没有给我正确的结果。我知道我很接近,我想也许我需要添加一个子查询?我应该朝着这个方向寻求指导将是一个巨大的帮助。

3 个答案:

答案 0 :(得分:2)

  

...这并没有给我正确的结果。

这并没有让我们知道问题是什么。

使用:

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'))

答案 1 :(得分:1)

您也应该使用GROUP BY条款,否则COUNT(Events.EventID)将在所有情况下返回1

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

你只需要在你的字段名称上使用反引号,如果它们恰好是保留字,fyi。

答案 2 :(得分:1)

尝试将您的查询更改为:

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

您需要对ContactID进行分组以计算每次联系的事件数量,如果联系人在CT或MA中有多个地址,您需要计算不同 EventID值。