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

如何编写SQL查询获取每个指定ID对应最多5条记录及总条数

按评论ID分组取最新TOP 5回复并返回总回复数SQL实现

通用方案(支持MySQL8.0+、PostgreSQL、SQL Server、Oracle等所有支持窗口函数的数据库)

使用窗口函数可以一次扫描完成分组排序、总计数统计,逻辑清晰性能优秀:

WITH ranked_replies AS (
    SELECT 
        ReplyId,
        ReplyContent,
        CommentId,
        PublishDate,
        -- 按评论ID分组,组内按发布时间倒序排名
        ROW_NUMBER() OVER (PARTITION BY CommentId ORDER BY PublishDate DESC) AS row_num,
        -- 统计每个评论对应的总回复数
        COUNT(*) OVER (PARTITION BY CommentId) AS TotalCount
    FROM Replies
    WHERE CommentId IN (1,2,3,4,5)
)
SELECT ReplyId, ReplyContent, CommentId, TotalCount
FROM ranked_replies
WHERE row_num <= 5
ORDER BY CommentId, PublishDate DESC;

兼容MySQL5.x等不支持窗口函数的数据库方案

使用关联子查询实现同等效果:

SELECT 
    R1.ReplyId,
    R1.ReplyContent,
    R1.CommentId,
    -- 子查询统计当前评论总回复数
    (SELECT COUNT(*) FROM Replies R2 WHERE R2.CommentId = R1.CommentId) AS TotalCount
FROM Replies R1
WHERE R1.CommentId IN (1,2,3,4,5)
-- 筛选组内发布时间排在前5的记录
AND (
    SELECT COUNT(*) 
    FROM Replies R3 
    WHERE R3.CommentId = R1.CommentId 
    AND R3.PublishDate > R1.PublishDate
) < 5
ORDER BY R1.CommentId, R1.PublishDate DESC;

注意事项

  • 如果你需要保留发布时间相同的并列第5条所有记录,可以把通用方案中的ROW_NUMBER()替换为RANK()或DENSE_RANK()
  • 按你给出的5个评论ID,最终返回的记录数最多为25条,你描述的最多50条应为笔误,若为10个评论ID则最多返回50条
  • 若回复表数据量较大,建议给CommentId和PublishDate字段加联合索引提升查询性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:15:03