如何通过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
相关产品推荐
相关产品推荐

