题解 | #筛选昵称规则和试卷规则的作答记录#
筛选昵称规则和试卷规则的作答记录
http://www.nowcoder.com/practice/1c5075503ccf4de1882976b2fff2c072
问题分析
找到昵称以"牛客"+纯数字+"号"或者纯数字组成的用户对于字母c开头的试卷类别(如C,C++,c#等)的已完成的试卷ID和平均得分,按用户ID、平均分升序排序。
- 昵称以"牛客"+纯数字+"号"或者纯数字组成的用户——正则匹配regexp/rlike+正则表达式
- 字母c开头的试卷类别(如C,C++,c#等)——模糊匹配like+通配符%
- 平均得分,取整——round()/avg()
- 按用户ID、平均分升序排序——order by
知识点
1、正则表达式,常用匹配符有:
^ : 匹配开头,如^s匹配以s或者S开头的字符串;
$ : 匹配结尾,如s$匹配以s结尾的字符串;
$ : 匹配结尾,如s$匹配以s结尾的字符串;
[] : 匹配任意一个[]内的字符,[0-9]可以匹配0-9的任意单个数字,[ab]*可匹配空串、a、b、或者由任意个a和b组成的字符串;
{n} : 匹配前一个字符反复n次;
+ : 匹配前一个字符1个或者多个(等于{1,});
. : 匹配任意单个字符;
* : 匹配0个或多个前一个得到的字符。
* : 匹配0个或多个前一个得到的字符。
2、like、rlike、regexp三者区别,like后面接字符串,常用匹配符有%和_,可以实现简单的字符或字符串匹配规则;rlike和regexp相似,后面接正则表达式,可以实现较复杂的字符或字符串匹配规则;
3、avg():计算平均值
4、round():四舍五入函数,第二个参数用来指定保留小数位,默认为0
5、order by:排序,默认按升序排序,降序后面接desc
答案参考
SELECT uid,exam_id ,round(avg(score))avg_score FROM exam_record WHERE score is not null and uid in (select uid from user_info where nick_name regexp '^牛客[0-9]+号$' &nbs***bsp;nick_name regexp '^[0-9]+$') and exam_id in (select exam_id from examination_info where tag like 'c%') GROUP BY uid,exam_id ORDER BY uid,avg_score;