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

如何通过SQL计算帖子点赞数并判断当前用户是否已点赞

单SQL实现帖子点赞统计+当前用户点赞状态查询

你只需要在原有分页查询的基础上,通过左连接关联点赞表+分组聚合,就能单条SQL返回你需要的全部字段,除了原有的分页参数@Offset、@GetCount,只需要额外传入当前访问用户ID参数@CurrentUserId即可。

最终SQL代码

SELECT 
    p.[Id],
    p.[Content],
    COUNT(l.[Id]) AS LikeCount,
    MAX(CASE WHEN l.[UserId] = @CurrentUserId THEN 1 ELSE 0 END) AS HadLiked
FROM [dbo].[Post] p
LEFT JOIN [dbo].[Like] l
    ON p.[Id] = l.[PostId]
GROUP BY 
    p.[Id],
    p.[Content],
    p.[CreatedDate]
ORDER BY p.[CreatedDate] DESC
OFFSET @Offset ROWS
FETCH NEXT @GetCount ROWS ONLY

逻辑说明

  • LikeCount统计逻辑:用左连接保留所有帖子(包括0点赞的帖子),对点赞表主键Id做COUNT统计时会自动忽略无点赞记录对应的NULL值,直接得到每篇帖子的总点赞数。
  • HadLiked判断逻辑:通过CASE语句匹配点赞记录的用户ID和当前传入的用户ID,分组后用MAX取值,只要存在一条当前用户对该帖子的点赞记录就返回1,否则返回0,正好对应是否点赞的布尔标识。
  • 分页逻辑完全兼容原有写法:分组字段包含排序用到的CreatedDate,不会破坏原有分页的排序规则和分页准确性。

优化建议

  • 给Like表创建(PostId, UserId)的联合唯一约束,从数据库层面阻止同一用户对同一帖子重复点赞的脏数据:
ALTER TABLE [dbo].[Like]
ADD CONSTRAINT UQ_Like_PostId_UserId UNIQUE (PostId, UserId)
  • 给Like表创建(PostId, UserId)的联合非聚集索引,数据量较大时可以大幅提升关联统计的查询速度:
CREATE NONCLUSTERED INDEX IX_Like_PostId_UserId ON [dbo].[Like] (PostId, UserId)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:36:17