(
        select
            p.cid,
            round(timestampdiff(minute, start_time, end_time), 3) as duration,
            score
        from
            play_record_tb p
            join course_info_tb c on p.cid = c.cid
        where
            timestampdiff(
                day,
                c.release_date,
                date_format(p.start_time, '%Y-%m-%d')
            ) <= 7
    ) a

这个方法用到子查询,题目的要求是1️⃣一周内,2️⃣平均分>3,3️⃣观看量,4️⃣观看时长。

首先我们可以在两个表合并后,用where筛选出start_time - release_time <= 7 的样本,然后计算得到观看时长,这里也要获得分数,因为题目要求中会用到score。

select
    a.cid,
    count(*) as pv,
    sum(duration) as time_len
from
    (
        select
            p.cid,
            round(timestampdiff(minute, start_time, end_time), 3) as duration,
            score
        from
            play_record_tb p
            join course_info_tb c on p.cid = c.cid
        where
            timestampdiff(
                day,
                c.release_date,
                date_format(p.start_time, '%Y-%m-%d')
            ) <= 7
    ) a
group by
    a.cid
having
    avg(score) >= 3
order by
    pv desc,
    time_len desc
limit
    3

根据uid进行group by,可以得到一些聚合的信息,count(*)是每个课的观看次数,还有总共的观看时长求和,having可以用于筛选group by完之后的条件,比如平均分 >= 3,再排序和返回3个就行。