牛客SQL.1.30

184 阅读2分钟

「这是我参与11月更文挑战的第14天,活动详情查看: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');
male|2
female|3

方法一

通过观察profile字段,我们可以发现该字段是由身高,体重,性别有规律的构成,所以可以使用substring_index函数,用,来分隔,取出最后一个当作查询值并且重命名为gender,最后以gender分组,用count来统计数量;sql语句如下:

SELECT SUBSTRING_INDEX(profile, ',', '-1') gender, COUNT(*) number 
FROM user_submit
GROUP BY gender;

方法二

利用IFLIKE来查询,两个组合得到female或者male,再同理分组统计;

SELECT IF(profile LIKE "%female", "female", "male") gender, COUNT(*) number
FROM user_submit
GROUP BY gender;

运行效果

对于方法一

在准备阶段,输入的sql语句变为了下图所示:

image-20211115095746363

SELECT SUBSTRING_INDEX(profile, ',', '-1') gender, COUNT(0) number 
FROM user_submit
GROUP BY gender;

最终选择的执行过程为:

image-20211115095843523

对表的访问选择了全表扫描,开销为2;另外由于分组,还需排序,开销为5;总共的开销为7;

对于方法二

在准备阶段,同样是将COUNT(*)变为了COUNT(0);

image-20211115100223540

SELECT IF(profile LIKE "%female", "female", "male") gender, COUNT(0) number
FROM user_submit
GROUP BY gender;

执行过程为如下过程:

image-20211115100326941

对于方法二,总的成本开销同样为7;这是在少量数据的情况下,数据多时,方法一是优于方法二的;