如何编写SQL查询识别用户未观看的系列剧集下一集
如何查询指定用户某系列未观看的下一集
别担心!刚学5小时SQL遇到这种问题太正常了,咱们一步步拆解来解决你的需求:
首先,你的核心需求是:给定一个用户ID和系列的titleID,找出这个用户在该系列里还没看过的下一集。咱们先理清楚需要用到的表和它们的关联关系:
history:存储用户看过的剧集,通过userID、titleID、episodeID关联Series:关联了titleID(系列标识)和episodeID(该系列下的所有剧集)Episode:存储剧集的详细信息(比如名称)
第一步:锁定目标用户和系列
咱们先明确要查询的目标用户(比如userID=8924)和目标系列(titleID='WalkingDead'),后续所有查询都围绕这个范围展开。
第二步:找出该系列中用户未观看的剧集
你之前用LEFT JOIN没得到正确结果,主要是没把用户和系列的条件放到关联逻辑里,也没通过Series表限定同一系列的剧集。正确的关联方式如下:
-- 先筛选出该系列中用户没看过的所有剧集ID SELECT s.episodeID FROM Series s -- 左关联用户的观看历史,同时限定用户和系列 LEFT JOIN history h ON s.episodeID = h.episodeID AND h.userID = 8924 AND h.titleID = 'WalkingDead' WHERE s.titleID = 'WalkingDead' -- 没有匹配到观看记录的剧集,就是用户未看过的 AND h.episodeID IS NULL;
第三步:获取剧集详情并找到“下一集”
要拿到剧集名称等信息,咱们把Episode表关联进来,再按剧集ID排序(你的剧集ID是按顺序命名的,比如WDS2E1、WDS2E2),取第一个结果就是用户该看的下一集:
SELECT e.episodeID, e.episodeName FROM Series s -- 关联Episode表获取剧集详情 JOIN Episode e ON s.episodeID = e.episodeID -- 左关联用户观看历史,限定目标用户和系列 LEFT JOIN history h ON s.episodeID = h.episodeID AND h.userID = 8924 AND h.titleID = 'WalkingDead' WHERE s.titleID = 'WalkingDead' -- 筛选出用户未观看的剧集 AND h.episodeID IS NULL -- 按剧集顺序排序,确保下一集是序列中的下一个 ORDER BY s.episodeID ASC -- 只返回第一个结果,就是目标下一集 LIMIT 1;
给你拆解每一部分的作用:
JOIN Episode e ON s.episodeID = e.episodeID:把Series里的剧集ID和Episode的详情关联起来,这样能拿到剧集名称。LEFT JOIN history h ON ...:把用户ID和系列ID的条件放到关联逻辑里,而非WHERE子句,这样LEFT JOIN会保留该系列所有剧集,只有用户看过的剧集才会匹配到history的记录,未观看的剧集对应的h.episodeID会是NULL。WHERE s.titleID = 'WalkingDead':确保只处理这个系列的剧集。AND h.episodeID IS NULL:筛选出用户没有观看记录的剧集。ORDER BY s.episodeID ASC:按剧集ID从小到大排序,保证“下一集”是序列里的下一个。LIMIT 1:只返回第一个结果,也就是用户该看的下一集。
如果你想动态切换用户和系列,只需要把8924和WalkingDead换成对应的变量就行啦~
内容的提问来源于stack exchange,提问作者TechnicalLudite
相关产品推荐
相关产品推荐

