考虑以下架构中的三个表 SQL Fiddle 。
- 这个迷你模型代表了我正在处理的数据库的一个简单示例。
- Users 表有 4 个属性,user_id(主键自动增量)、country_id(引用 Country 表的外键)、user_msisdn(电话号码)用户号码和用户名。
- Contacts 表有 3 个属性:contact_id(主键自动增量)、user_id(引用 Users 表的外键)以及 contact_msisdn(用户联系人的电话号码(您手机联系人列表中的电话号码)。
- 用户表和联系人表之间是多对多的关系,一个用户可以有多个联系人,并且可以在任何用户的联系人中找到一个联系人联系人列表。
要求:
对于每个国家/地区,获取至少拥有一个“用户联系人”的用户计数,其中“用户联系人”是作为用户的联系人,以及没有任何“用户联系人”的用户计数”。
例如,对于国家 = '瑞典' (country_id = 3),user_id = 3 在联系人表中有两个联系人,这些联系人被视为“用户联系人”,格式为 (msisdn =“+220011223344”和“+224433221100”)。因此,我想要的查询结果是:瑞典有 1 个用户 (user_id = 3) 至少有一个“用户联系人”,0 个用户没有“用户联系人”,每个国家/地区依此类推。
最佳答案
试试这个:
SELECT c.country_id,
COUNT(DISTINCT CASE WHEN u2.user_id IS NOT NULL THEN u.user_id END) as has_contact_that_is_user ,
COUNT(distinct CASE WHEN u2.user_id is null AND u.user_id IS NOT NULL THEN u.user_id END) as has_no_contact_that_is_user
FROM Country c
LEFT JOIN users u
ON(c.country_id = u.country_id)
LEFT JOIN contacts co
ON(co.user_id = u.user_id)
LEFT JOIN Users u2
ON(u2.user_msisdn = co.contact_msisdn)
GROUP BY c.country_id
<强> Fiddle
关于MySQL - 获取具有 "user-contact"的用户数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38292266/