指定categoryId的视频历史记录总数统计SQL查询报错求助
解决指定分类视频的历史记录统计问题
嘿,我明白你遇到的这个问题了——那个子查询返回了多个视频ID,而单等号=只能匹配单个值,这就直接导致了报错。咱们来调整一下查询逻辑,既能拿到指定分类下所有视频的历史记录统计,又不会出问题。
方案1:用JOIN分组统计(推荐)
这是最直观且性能友好的方式,能直接得到每个视频对应的历史记录总数,哪怕某个视频没有任何历史记录也会显示0:
SELECT v.id AS video_id, COUNT(h.id) AS history_count FROM "videos" v LEFT JOIN "histories" h ON h.videoId = v.id WHERE v.categoryId = '9f5a0e6f-512b-425a-9225-600f876c0105' GROUP BY v.id;
- 用
LEFT JOIN可以保留所有符合分类条件的视频,哪怕它没有任何历史记录;如果只想统计有历史记录的视频,换成INNER JOIN即可。 GROUP BY v.id按视频ID分组,COUNT(h.id)统计每组对应的历史记录条数。
方案2:如果只需要所有视频的历史记录总数
要是你不需要单个视频的统计,只想知道指定分类下所有视频的历史记录总和,可以用IN代替=:
SELECT COUNT(*) FROM "histories" h WHERE h.videoId IN ( SELECT id FROM "videos" WHERE categoryId = '9f5a0e6f-512b-425a-9225-600f876c0105' );
这个查询会把符合分类的所有视频ID作为集合,匹配历史表中的记录,最后统计总数。
方案3:使用相关子查询
你也可以在SELECT语句里嵌套子查询,直接为每个视频计算历史记录数:
SELECT v.id AS video_id, (SELECT COUNT(*) FROM "histories" h WHERE h.videoId = v.id) AS history_count FROM "videos" v WHERE v.categoryId = '9f5a0e6f-512b-425a-9225-600f876c0105';
这个写法和方案1效果类似,但在数据量较大时,JOIN的性能通常会更好,因为相关子查询是逐行执行的。
内容的提问来源于stack exchange,提问作者Patryk Cieszkowski
相关产品推荐
相关产品推荐

