牛客SQL.1.32

149 阅读2分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

描述

题目:现在运营举办了一场比赛,收到了一些参赛申请,表数据记录形式如下所示,现在运营想要统计每个年龄的用户分别有多少参赛者,请取出相应结果

示例:user_submit

img

根据示例,你的查询应返回以下结果:

img

示例1

drop table if exists user_submit;
CREATE TABLE `user_submit` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`profile` varchar(100) NOT NULL,
`blog_url` varchar(100) NOT NULL
);
INSERT INTO user_submit VALUES(1,2138,'180cm,75kg,27,male','http:/url/bisdgboy777');
INSERT INTO user_submit VALUES(1,3214,'165cm,45kg,26,female','http:/url/dkittycc');
INSERT INTO user_submit VALUES(1,6543,'178cm,65kg,25,male','http:/url/tigaer');
INSERT INTO user_submit VALUES(1,4321,'171cm,55kg,23,female','http:/url/uhsksd');
INSERT INTO user_submit VALUES(1,2131,'168cm,45kg,22,female','http:/url/sysdney');
27|1
26|1
25|1
23|1
22|1

方法一

根据题意,需要求出每个年龄段的人数,而表中并没有直接给出年龄字段,需要我们自己从profile字段中截取出来;考察的是对字符串截取函数的应用。具体到这题,可以看到,profiile中是有规律可循,每个指标都用逗号隔开,因此,我们可以使用SUBSTRING_INDEX这个函数来分隔字符串,取到我们想要的年龄字段;sql语句如下:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(profile, ',', -2), ',', 1) AS age, COUNT(*)
FROM user_submit
GROUP BY age;

其中以180cm,75kg,27,male为例,SUBSTRING_INDEX(profile, ',', -2)是将字符串以逗号分隔,-2表示的是取倒数第二个逗号右边的字符串,取得的字符串为27,male,再一次对取得的字符串截取SUBSTRING_INDEX(str, ',', 1),最终得到的就是27年龄;

运行效果

image-20211116111133944

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(profile, ',', -2), ',', 1) AS age, COUNT(0)
FROM user_submit
GROUP BY age;

最终的执行语句为如上;

image-20211116111301979

执行计划为对表进行全表扫描,扫描开销为2,由于存在分组,所以还需要排序,排序的开销为5;