解决查询重复玩家时结果中玩家位置被交换的问题
解决玩家重复数据查询的位置交换问题
原查询的问题在于:子查询通过LEAST和GREATEST统一玩家对的顺序来统计重复,但关联时会让原记录与分组后的统一顺序玩家对匹配,导致部分记录的分组后玩家顺序与原记录相反。
要保留原记录的player1和player2顺序,同时显示该玩家对的重复次数,可修改查询如下:
select s.id, s.player1, s.player2, LEAST(s.player1, s.player2) as least_player, GREATEST(s.player1, s.player2) as greatest_player, t.qty from users s join ( select LEAST(player1, player2) as pair_min, GREATEST(player1, player2) as pair_max, count(*) as qty from users group by pair_min, pair_max having count(*) > 1 ) t on t.pair_min = LEAST(s.player1, s.player2) and t.pair_max = GREATEST(s.player1, s.player2)
说明:
- 子查询依然按玩家对的最小/最大标识分组统计重复次数,确保
(p1,p2)和(p2,p1)被视为同一组; - 主查询保留原记录的
player1和player2顺序,同时新增least_player和greatest_player列展示统一的玩家对标识; - 关联条件通过计算原记录的最小/最大玩家与子查询的分组标识匹配,确保每条重复记录都能关联到正确的统计结果,且原玩家顺序不被修改。
如果需求是仅显示原玩家顺序与统一最小/最大顺序一致的记录,可在主查询末尾添加过滤条件:
where s.player1 = LEAST(s.player1, s.player2)
内容的提问来源于stack exchange,提问作者Dark
相关产品推荐
相关产品推荐

