MySQL - 获取具有 "user-contact"的用户数

标签 mysql join count

考虑以下架构中的三个表 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/

相关文章:

mysql - 带连接的复杂查询,如何检索 COUNT

php - 如何在使用php在mysql中上传时调整图像大小

php - 提高网站性能的建议 - PHP/MySQL

Mysql 查询通过选择查询获取插入的用户名和更新的用户名?

c - 退出 pthread 会导致段错误

Mysql,仅使用一个冒号创建一个 DISTINCT,同时显示另一个冒号

c# - Entity Framework 6 和 MySQL,模型优先

javascript - 如何用数组过滤对象

sql - 在 SQL 2008 中使用 CASE 更新多行

javascript - 为什么在 javascript 中的数学运算后不添加 '+ ""' 会使新变量长度的计数未定义?