通过代码

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]”匹配两种写法的任何字母。

为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”