Mysql分组之后添加序列号

1,业务场景描述

统计学校学生性别比例分布最高的前5个城市

2,表结构

城市表:
student_city:city_id,city_name
学生信息表:
student_info:stu_id,stu_name,stu_gender,city_id

3,SQL实现

SELECT (@i := @i+1) AS '排名', 
si.stu_id AS 'ID', 
si.stu_name AS '姓名', 
CASE si.stu_gender 
WHEN 0 THEN '男' 
WHEN 1 THEN '女' 
END AS '性别' 
FROM student_info si ,(SELECT @i := 0) s 
ORDER BY si.stu_id DESC 
LIMIT 5
排名ID姓名性别
19孔雀公主
28蝎子精
37牛魔王
46铁扇公主
55白骨精

表1-单表查询操作

SELECT (@i := @i+1) AS '排名', 
sc.city_name AS '城市', 
COUNT(si.stu_gender) AS '总数', 
si.city_id AS '城市ID' 
FROM (SELECT @i := 0) s, student_info si 
LEFT JOIN student_city sc ON sc.city_id = si.city_id 
GROUP BY sc.city_name 
ORDER BY COUNT(si.stu_gender) DESC 
LIMIT 5
排名城市总数城市ID
2上海22
3广州23
6商丘26
1北京11
4深圳14

表2-分组查询操作

单表操作是没有任何问题的,可是加了GROUP BY分组之后发现序列号是乱序

SELECT (@i := @i+1) AS '排名',
cityName AS '城市',
total AS '总数',
city_id AS '城市ID' 
FROM ( 
SELECT sc.city_name AS cityName, 
COUNT(si.stu_gender) AS total, 
si.city_id 
FROM (SELECT @i := 0) s, student_info si 
LEFT JOIN student_city sc ON sc.city_id = si.city_id 
GROUP BY sc.city_name 
ORDER BY COUNT(si.stu_gender) DESC 
LIMIT 5 
) d
排名城市总数城市ID
1上海22
2广州23
3商丘26
4北京11
5深圳14

表3-分组再查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值