MySQL查询优化:获取集群内所有用户均评分的企业
解决MySQL查询集群内全用户评分企业的问题
我来帮你搞定这个需求!你要找的是指定集群内所有用户都已评分的企业——也就是只要集群里有任何一个用户没给某企业评分,就直接排除掉它。核心思路很清晰:先算出目标集群的用户总数,再统计每个企业被该集群内多少用户评分,只保留评分用户数等于集群总用户数的企业,最后关联其他表拿到你需要的所有字段。
修改后的查询语句如下:
SELECT muc.primaryUser, muc.clusterId, mr.companyId, mr.rating, mul.groupId FROM ml_user_clusters muc JOIN ml_ratings mr ON mr.userId = muc.primaryUser JOIN ml_company_user_labels mcul ON mcul.companyId = mr.companyId JOIN ml_user_labels mul ON mul.groupId = mcul.labelId -- 筛选出符合条件的企业:被集群内所有用户评分 WHERE muc.clusterId = 0 AND mr.companyId IN ( SELECT mr_inner.companyId FROM ml_user_clusters muc_inner JOIN ml_ratings mr_inner ON mr_inner.userId = muc_inner.primaryUser WHERE muc_inner.clusterId = 0 GROUP BY mr_inner.companyId -- 统计该企业被多少集群内用户评分,等于集群总用户数则保留 HAVING COUNT(DISTINCT mr_inner.userId) = ( SELECT COUNT(DISTINCT primaryUser) FROM ml_user_clusters WHERE clusterId = 0 ) );
关键部分解释:
- 集群用户总数统计:
(SELECT COUNT(DISTINCT primaryUser) FROM ml_user_clusters WHERE clusterId = 0)这个子查询会算出clusterId=0集群里的总用户数,明确我们需要多少个用户评分才算“全用户覆盖”。 - 筛选合格企业:内层的
GROUP BY mr_inner.companyId+HAVING COUNT(DISTINCT mr_inner.userId) = ...会统计每个企业被集群内多少用户评分,只有评分用户数完全匹配集群总用户数的企业才会被选中。 - 关联拿全字段:最后把筛选出的合格企业ID和原表关联,就能拿到你需要的
primaryUser、rating、groupId等所有字段了。
按照这个语句执行,就能得到你预期的、仅包含groupId=6的企业的所有相关记录啦。
内容的提问来源于stack exchange,提问作者tolgatanriverdi
相关产品推荐
相关产品推荐

