道歉;我的问题在具体的例子中更加清晰。
我有两个表 - 一个用于人,一个用于地址。我把它们组合在一起并选择了相关部分:
ID | Address | Address_Status ------------------------------- 1 | 2 Main St | Active 1 | 19 Elm Rd | Inactive 1 | 7 Red Ave | Active 2 | 9 Gold St | Inactive 2 | 3 Rich St | Inactive
我正在尝试选择拥有所有非活动地址的人的ID。这意味着在输出中,唯一的记录应该是ID = 2.我已经尝试按ID分组,然后使用having (count(*) - count(Address_Status = 'I')) = 0
,这就像我来的那样接近。
答案 0 :(得分:0)
如果用户根本没有地址,则应省略是吗? 在那种情况下,我喜欢这样的东西:
SELECT People.ID, People.Name,
SUM(IF(Addresses.Address_Status = 'I', 1, 0)) AS InactiveCount,
SUM(IF(Addresses.Address_Status != 'I', 1, 0)) AS ActiveCount,
FROM People JOIN Addresses ON Addresses.personID = People.ID
GROUP BY People.ID
HAVING ActiveCount = 0 AND InactiveCount > 0
答案 1 :(得分:0)
一种可能性是加入地址表并仅返回没有活动记录的值:
Select P.* from People P
left join (Select * from addresses where Address_status="ACTIVE") A
on P.id=A.pid
where A.pid is null;
这里的缺点是你还会返回任何没有注册地址的用户,这可能不是预期的行为。