MySQL统计两支球队对阵唯一组合的不重复比赛总场次
问题原因
你当前的自连接写法会生成对称重复行:主表取「A为主场、B为客场」的记录时,会匹配副表「B为主场、A为客场」的记录生成第一行结果;主表取「B为主场、A为客场」的记录时,又会匹配副表「A为主场、B为客场」的记录生成第二行结果,最终同一组对阵会返回两条重复记录。
解决方案
不需要多层子查询和自连接,直接对主客队做无序归组后聚合计数即可,写法简洁、执行效率更高,返回结果完全符合你的预期:
全数据库兼容写法
SELECT CASE WHEN home_team < away_team THEN home_team ELSE away_team END AS `home team`, CASE WHEN home_team < away_team THEN away_team ELSE home_team END AS `away team`, COUNT(*) AS matches FROM results GROUP BY 1, 2;
简化写法(MySQL、PostgreSQL等支持LEAST/GREATEST函数的数据库可用)
SELECT LEAST(home_team, away_team) AS `home team`, GREATEST(home_team, away_team) AS `away team`, COUNT(*) AS matches FROM results GROUP BY 1, 2;
逻辑说明
无论两队主客场身份如何,都按固定规则排序:把名称字典序靠前的球队放在第一列、靠后的放在第二列,从根源上避免同一对阵组合因为主客场交换生成不同的分组键。直接按排序后的两个队伍字段分组计数,统计的就是两队所有主客场安排下的总交手场次,每组对阵仅返回一条记录,和你给出的示例输出完全一致。
如果一定要基于原有写法修改去重,只需要在查询最外层加过滤条件WHERE home.home_team < home.away_team即可,但这种写法冗余度高、执行性能差,不推荐使用。
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

