多表联查指定列去重统计:Offer重复计数问题求助
解决Offer按Profile统计且去重的问题
我懂你遇到的麻烦了——你想要统计指定Profile关联的每个Offer的数量,但不管这个Offer绑定了多少个Skill,都只计数一次,之前的查询因为Skill的多条重复记录,导致统计结果不对,对吧?
问题根源
你的原始查询里,ternary_relationship表中同一个id_Offer + id_Profile会对应多个id_Skill,和Offer表JOIN之后,会生成多条相同Offer的记录。COUNT(*)会把这些重复的记录全部算进去,所以才会出现重复计数的问题。
解决方案
这里有两种简单的修正方法,都能实现“每个Offer仅计数一次”的需求:
方法1:先去重再关联
先从三元关系表中筛选出指定Profile关联的唯一Offer列表,再和Offer表关联统计:
SELECT o.business_name, COUNT(tr.id_Offer) AS offer_count FROM Offer o INNER JOIN ( -- 先获取指定Profile关联的所有唯一Offer SELECT DISTINCT id_Offer FROM ternary_relationship WHERE id_Profile = '1' ) tr ON o.id_Offer = tr.id_Offer GROUP BY o.business_name ORDER BY offer_count DESC;
方法2:直接在COUNT中使用DISTINCT
如果不想写子查询,可以直接在COUNT()里指定去重的字段,这样即使JOIN后有重复的Offer记录,也只会计数一次:
SELECT o.business_name, COUNT(DISTINCT o.id_Offer) AS offer_count FROM Offer o INNER JOIN ternary_relationship tr ON o.id_Offer = tr.id_Offer AND tr.id_Profile = '1' GROUP BY o.business_name ORDER BY offer_count DESC;
结果验证
针对你提供的测试数据,这两种方法都会得到正确的结果:
- business-1 计数1(对应Offer1)
- business-2 计数1(对应Offer2)
因为Profile1分别关联了Offer1和Offer2各一次(不管每个Offer绑定多少Skill),所以每个business_name的计数都是1。
内容的提问来源于stack exchange,提问作者monkey intern
相关产品推荐
相关产品推荐

