Mysql Group By 灵活应用
- 场景
有赛事球员表 记为race_player
赛事表 race
球员表 player
现在需要查询 ,每个球员未开赛,最近一场的赛事球员数据.
- 分析
条件 :未开赛
聚合纬度 :球员
聚合选取条件:未开赛且比赛时间最小
- 探究
确定 赛事球员的幂等是赛事id,球员id.
那么,在选取赛事球员对象的时候,就需要构造成这样的参数对.
那么,首先应该先查出这样的参数对.
代码:1
2
3
4select min(r2.match_time) t,player_id from race_player r1
left join race r2 on r1.race_id = r2.id
where r2.race_status = 1
group by r1.player_id
这里查出球员id,对应的最小比赛时间. 也就是相当于赛事id(在做一层关联).
这里使用赛事球员关联赛事,聚合球员.取得球员对应的最小值.因为这里只需要走一层关联.
如果采用赛事 -> 球队 -> 球员 去查这个幂等对.会多走一层关联.
选取好这个幂等对,首先需要转化为赛事id.所以这里还需要在关联赛事,用于获取赛事id.
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14SELECT rp.* FROM race_player rp
LEFT JOIN player tp ON rp.player_id = tp.id
LEFT JOIN race r ON rp.race_id = r.id
LEFT JOIN (
select min(r2.match_time) t,player_id from race_player r1
left join race r2 on r1.race_id = r2.id
where r2.race_status = 1 //赛事条件
group by r1.player_id
) r3 on r3.t = r.match_time and r3.player_id = rp.player_id
WHERE
//其他条件
ISNULL(rp.id) = FALSE
AND ISNULL(tp.id) = FALSE
AND ISNULL(r.id) = FALSE ;
这样,有序列的group by 就完成了.
group by 大多数情况下.希望以后这个函数会优化成group by可以先order by
再group by选取指定行.而不是只能采用聚合函数.那面对这样的问题,就很简单了.