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

指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:37:29