1、sql语句练习

260 阅读1分钟

1、问题描述

一个video表,里面有三个字段user_id、video_id、start_time

表里面的一行记录表示的是某个user在在某个time看了某个video

要求:今天看不同视频数量超过100个的用户id的前三名

2、问题分析

  • 今天:查询条件带有时间范围控制
  • 不同视频:在相同用户下可能会出现重复查看视频,记得去重
  • 超过100:去重过后总数要大于100
  • 前三名:排序取出前三

隐藏问题:分组 group by

3、问题分步解析

起始时间 {datetime格式}

  • 今天:查询条件时间举例

    to_days(起始时间) <= to_days(now());使用to_days()函数

    昨天:to_days(NOW()) - TO_DAYS(起始时间) <= 1

    近30天:DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(起始时间戳)等等

  • 不同视频:去重方式 ‘distinct 去重字段’ count(distinct 去重字段) 计算不重复总数

  • 超过100:即count(distinct 去重字段) >100

  • 前三名:使用 ‘order by 字段名’ 排序,desc 降序 asc 升序,取出前三 使用limit 3 限制一下即可

4、问题解决

SELECT user_id, COUNT(DISTINCT video_id) AS 总数 
    FROM video 
    WHERE TO_DAYS(start_time)<=TO_DAYS(NOW()) 
    GROUP BY user_id 
    HAVING COUNT(DISTINCT video_id)>100 
    ORDER BY COUNT(DISTINCT video_id) DESC 
    LIMIT 3;