




本文介绍如何将原本需要两次查询(先查球队列表,再为每个球队单独查最新赛事)合并为一条高效 sql,通过 left join 与 group by 配合聚合函数 max(),直接返回每个球队及其最近一场已结束赛事的时间。
在实际开发中,类似“为每个球队获取其最新已完成比赛时间”的需求非常常见。若采用原始方式——先执行 SELECT * FROM teams,再对每支队伍循环执行子查询 SELECT time FROM events WHERE home_team = ? OR away_team = ? AND status IN ('FT','PEN','AET') ORDER BY
time DESC LIMIT 1——不仅会产生 N+1 查询问题,还显著增加数据库负载和响应延迟。
更优解是使用单条聚合查询,核心思路是:
以下是完整、安全、可直接运行的 SQL 示例:
SELECT
teams.id,
teams.name,
teams.updated,
MAX(events.time) AS latest_time
FROM teams
LEFT JOIN events
ON (events.home_team = teams.id OR events.away_team = teams.id)
AND events.status IN ('FT', 'PEN', 'AET')
GROUP BY teams.id, teams.name, teams.updated
ORDER BY teams.name ASC;✅ 关键优化说明:
⚠️ 注意事项:
综上,该单查询方案兼具可读性、性能与健壮性,是替代 N+1 循环查询的标准实践。