【问题标题】:MySQL - Get count of users that have a "user-contact"MySQL - 获取具有“用户联系人”的用户数
【发布时间】:2016-11-12 12:49:24
【问题描述】:

考虑以下架构中的三个表SQL Fiddle。

  • 这个迷你模型代表了我正在处理的数据库的一个简单示例。
  • Users表有4个属性,user_id(主键auto_increment),country_id是引用Country表的外键,user_msisdn是电话用户编号和用户名。
  • Contacts 表有 3 个属性,contact_id(主键 auto_increment),user_id 是引用 Users 表的外键,contact_msisdn 是用户联系人的电话号码(您的电话联系人列表中的电话号码)。
  • Users表和Contacts表的关系是多对多的,一个用户可以有多个联系人,一个联系人可以在任何用户的联系人列表。

要求:
对于每个国家/地区,获取至少有一个“用户联系人”的用户计数,其中“用户联系人”是作为用户的联系人,以及没有任何“用户联系人”的用户计数"。

例如, 对于 country = 'Sweden' (country_id = 3),user_id = 3 在 Contacts 表中有两个联系人被考虑“用户联系人”与(msisdn = '+220011223344' & '+224433221100')。所以我想要的查询结果:瑞典有 1 个用户 (user_id = 3) 至少有一个“用户联系人”,零个用户没有“用户联系人”,依此类推。

【问题讨论】:

    标签: mysql join count


    【解决方案1】:

    试试这个:

    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

    【讨论】:

    • 查询结果是说country_id = 1的“美国”有(has_contact = 1 & no_contact = 1),实际上应该是(has_contact = 0, and no_contact = 2) ),因为 Contacts 表中 user_id = 1 的 3 个联系人不是同一时间的用户。所以,真实的结果说用户的联系人也应该是用户。
    • 更好的计数命名:has_contact_that_is_user & has_no_contact_that_is_user
    • @Mohammad-AliItani 哦,你没有很好地解释你自己.. 已修复,立即尝试
    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 2015-01-23
    • 2011-07-04
    • 2023-01-15
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多