我遇到了这个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
但这并没有给我正确的结果。我知道我很接近,我想也许我需要添加一个子查询?我应该朝着这个方向寻求指导将是一个巨大的帮助。
答案 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值。