Lmxy1990 ' Blog

SQL Group By Order By

Mysql Group By 灵活应用

  1. 场景
    有赛事球员表 记为race_player
    赛事表 race
    球员表 player
    现在需要查询 ,每个球员未开赛,最近一场的赛事球员数据.

  1. 分析
    条件 :未开赛
    聚合纬度 :球员
    聚合选取条件:未开赛且比赛时间最小

  1. 探究
    确定 赛事球员的幂等是赛事id,球员id.
    那么,在选取赛事球员对象的时候,就需要构造成这样的参数对.
    那么,首先应该先查出这样的参数对.
    代码:
    1
    2
    3
    4
    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

这里查出球员id,对应的最小比赛时间. 也就是相当于赛事id(在做一层关联).
这里使用赛事球员关联赛事,聚合球员.取得球员对应的最小值.因为这里只需要走一层关联.
如果采用赛事 -> 球队 -> 球员 去查这个幂等对.会多走一层关联.
选取好这个幂等对,首先需要转化为赛事id.所以这里还需要在关联赛事,用于获取赛事id.
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 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选取指定行.而不是只能采用聚合函数.那面对这样的问题,就很简单了.


End

坚持原创技术分享,您的支持将鼓励我继续创作!