如何用MySQL查询所有足球球员及其参与的最后一场赛事详情?
没问题,我来帮你搞定这个查询!首先得确认下——你应该有个关联球员和赛事的中间表吧?比如叫player_fixtures,包含player_id和fixture_id字段(毕竟球员和赛事是多对多关系),我下面的示例就用这个表来写啦。
方法一:子查询关联(兼容所有MySQL版本)
这种方法适合所有MySQL版本,核心思路是先给每个球员找到他们参与的赛事里日期最新的那一场的ID,再关联回去拉取赛事详情,确保子查询只返回单个结果。
SELECT p.id AS player_id, p.name AS player_name, p.team_id, f.id AS fixture_id, f.period, f.date AS last_fixture_date -- 这里可以添加fixtures表的其他字段 FROM players p LEFT JOIN ( -- 子查询:获取每个球员的最后一场赛事ID SELECT pf.player_id, MAX(f.date) AS last_date, -- 用GROUP_CONCAT配合ORDER BY取最新的fixture_id,保证单个结果 SUBSTRING_INDEX(GROUP_CONCAT(f.id ORDER BY f.date DESC, f.id DESC), ',', 1) AS last_fixture_id FROM player_fixtures pf JOIN fixtures f ON pf.fixture_id = f.id GROUP BY pf.player_id ) AS player_last_fixture ON p.id = player_last_fixture.player_id LEFT JOIN fixtures f ON player_last_fixture.last_fixture_id = f.id;
- 内层子查询通过
GROUP BY player_id分组,用MAX(f.date)定位每个球员的最晚赛事日期; SUBSTRING_INDEX(GROUP_CONCAT(...), ',', 1)用来精准获取对应日期的赛事ID,如果同一天有多个赛事,会取ID最大的那个,你可以调整ORDER BY的字段来适配需求;- 用
LEFT JOIN关联球员表,这样即使没有参与任何赛事的球员也会出现在结果里,对应的赛事字段会显示为NULL。
方法二:窗口函数(MySQL 8.0+推荐)
如果你的MySQL版本是8.0或更高,用窗口函数会更简洁直观,性能也更优:
WITH player_fixture_ranked AS ( SELECT p.id AS player_id, p.name AS player_name, p.team_id, f.id AS fixture_id, f.period, f.date, -- 按球员分组,按赛事日期倒序排名,最新的赛事排第1 ROW_NUMBER() OVER (PARTITION BY p.id ORDER BY f.date DESC, f.id DESC) AS rn FROM players p LEFT JOIN player_fixtures pf ON p.id = pf.player_id LEFT JOIN fixtures f ON pf.fixture_id = f.id ) SELECT player_id, player_name, team_id, fixture_id, period, date AS last_fixture_date FROM player_fixture_ranked WHERE rn = 1;
- 先用CTE(公共表表达式)给每个球员的所有赛事按日期倒序排名,最新的赛事会被标记为
rn=1; - 最后筛选出
rn=1的记录,就是每个球员的最后一场赛事详情,同样保留了未参与赛事的球员。
关键注意点
- 如果你的中间表名字不是
player_fixtures,记得替换成实际的表名; - 如果
fixtures表的日期字段是datetime类型,逻辑完全适用,无需修改; - 两种方法都确保了子查询/分组只返回单个结果,不会出现一对多的重复数据。
内容的提问来源于stack exchange,提问作者SheppardDigital
相关产品推荐
相关产品推荐

