通过代码
SELECT
e_r.uid,
e_r.exam_id,
ROUND(avg(score),0) avg_score
FROM
user_info u_i
LEFT JOIN
exam_record e_r
ON
u_i.uid = e_r.uid
RIGHT JOIN
examination_info e_i
ON
e_r.exam_id = e_i.exam_id
WHERE
tag LIKE 'c%'
and (nick_name RLIKE '^牛客[0-9]*号$' OR nick_name RLIKE '^[0-9]*$')
and score is NOT NULL
GROUP BY
e_r.uid,e_r.exam_id
ORDER BY
uid,avg_score
思路
找到昵称以"牛客"+纯数字+"号"或者纯数字组成的用户对于字母c开头的试卷类别(如C,C++,c#等)的已完成的试卷ID和平均得分,按用户ID、平均分升序排序。
一个简单的三表连接然后正则筛选:
正则模式匹配:
当使用正则匹配时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,功能是一样的)。
其中涉及到的字符是:
“.” 匹配任何单个的字符。
“[…]” 表示匹配在方括号内的任何字符。如,”[abc]” 则匹配”a”、”b”或者”c”,“[a-z]”匹配任何小写字母,而“[0-9]”匹配任何数字。
“ * ”表示匹配零个或多个在它前面的东西。例如,“x *”匹配任何数量的“x”字符,“[0-9]*”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。
注意:正则表达式是区分大小写的,但是我们也能使用一个字符类匹配两种写法。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。
为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。