You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何统计每个ID用户首日观看的不同电影数量并修正查询错误

问题根因

你原查询中WHERE条件的子查询SELECT MIN(day) FROM moviewatching返回的是全表所有记录的最早日期,不是每个用户ID对应的专属最早日期,所以只会返回全表最早当天的用户记录。同时你原查询GROUP BY包含了movies字段,会导致每条电影单独分为一组,COUNT(movies)结果永远为1,无法统计单用户单日的总观影数。


解决方案

方案1:关联子查询(兼容所有MySQL版本)

通过关联子查询匹配每个ID自己的最早观影日:

-- 仅查询每个用户首次观影日的所有观影记录
SELECT ID, name, movies, day
FROM moviewatching t1
WHERE day = (
    SELECT MIN(day) 
    FROM moviewatching t2 
    WHERE t2.ID = t1.ID
)
ORDER BY ID;

如果需要统计每个用户首次观影日的不同电影数量,用以下语句:

-- 统计每个用户首次观影日的不同电影数量
SELECT ID, name, day, COUNT(DISTINCT movies) AS distinct_movies
FROM moviewatching t1
WHERE day = (
    SELECT MIN(day) 
    FROM moviewatching t2 
    WHERE t2.ID = t1.ID
)
GROUP BY ID, name, day
ORDER BY ID;

方案2:窗口函数(MySQL 8.0+ 推荐)

用RANK()窗口函数给每个用户的观影记录按日期升序排序,取排序值为1的就是首次观影日的记录:

-- 仅查询每个用户首次观影日的所有观影记录
WITH user_movie_rank AS (
    SELECT 
        ID, name, movies, day,
        RANK() OVER(PARTITION BY ID ORDER BY day ASC) AS rn
    FROM moviewatching
)
SELECT ID, name, movies, day
FROM user_movie_rank
WHERE rn = 1
ORDER BY ID;

统计数量的版本:

-- 统计每个用户首次观影日的不同电影数量
WITH user_movie_rank AS (
    SELECT 
        ID, name, movies, day,
        RANK() OVER(PARTITION BY ID ORDER BY day ASC) AS rn
    FROM moviewatching
)
SELECT ID, name, day, COUNT(DISTINCT movies) AS distinct_movies
FROM user_movie_rank
WHERE rn = 1
GROUP BY ID, name, day
ORDER BY ID;

内容的提问来源于stack exchange,提问作者SQL N3rd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:18:02