多关联表中去重统计customers.userid的MySQL语法问题
解决方法
你的SQL主要存在这些问题:
- COUNT语法错误:
select DISTINCT COUNT sub2.userid是错误写法,MySQL中统计去重字段的数量,正确格式是COUNT(DISTINCT 字段名)。 - 关联字段写错:
customers.id=customerscategories.adid里的adid应该是Customerid——根据你的表结构,customerscategories的外键列是Customerid,对应customers的Id字段。 - 子查询冗余:你的SQL嵌套了过多不必要的层级,完全可以简化写法,提升可读性和执行效率。
简化后的正确SQL:
直接关联三个表,筛选pcatid=101的记录后统计去重的userid数量:
SELECT COUNT(DISTINCT c.userid) AS unique_user_count FROM customers c JOIN customerscategories cc ON c.Id = cc.Customerid JOIN categories cat ON cc.Catid = cat.Id WHERE cat.pcatid = 101;
执行这条语句就能得到你期望的结果2。
若要修正原嵌套写法:
调整语法错误、修正关联字段并优化子查询后:
SELECT COUNT(DISTINCT final_sub.userid) FROM ( SELECT c.userid FROM ( SELECT sq.id, cat.pcatid FROM ( SELECT c.id, cc.catid FROM customers c INNER JOIN customerscategories cc ON c.Id = cc.Customerid ) AS sq INNER JOIN categories cat ON sq.catid = cat.Id WHERE cat.pcatid = 101 ) AS sub INNER JOIN customers c ON sub.id = c.id ) AS final_sub;
不过更推荐使用第一个简化版本,逻辑清晰且执行效率更高。
内容的提问来源于stack exchange,提问作者Red
相关产品推荐
相关产品推荐

