Gorm复杂SQL - 连表,Group,查找最后一个数据
Dec 16, 2021
»
开发
业务场景:需要获取某个用户的被点赞记录,将这个业务逻辑合并到一条sql中执行
被点赞记录分为两种:自己发送的评论被点赞,和自己发布的作品被点赞。同时要求合并点赞记录,只显示最后一个点赞人和时间。同时还需要进行分页获取Offset/Limit
其中,评论被用户点赞的记录存储在一个 comment_user 的连接表中, 其为复合主键:作品id,评论id,其他数据为点赞的发起者uid, 而我们希望获取消息时,返回包括该条评论的详细信息,点赞发起者的详细信息等额外消息。这两种消息分布在user,comment表格中,其中额外comment做了行分表存储以优化效率
// 选出自己发的所有评论
A := SELECT id, cid
FROM comments
WHERE sender = {uid}
// 选出被赞的部分, 合并
// 不同文章id下的cid可能会重复
B := SELECT id, cid, COUNT(*)
FROM comment_user
WHERE (id, cid) IN A
GROUP BY id, cid
// 使用自连接的方式拿到最大的并且合并进去
C := SELECT id, cid, uid, max(time)
FROM comemnt_user
WHERE (id, cid) IN A
SELECT * FROM (B INNER JOIN C) AS a ON B.id = C.id AND B.cid = C.cid
参考这位老哥的回答
被点赞的文章相对来说简单,用户对应文章创作关系记录存在单独邻接表user_text中,主键为text_id。返回文章相关额外消息,text表也进行了行分表存储。
思路相对明确。两类不同的消息需要处理成同一个表,之后再去使用Offset/Limit。Gorm中使用临时struct可以直接映射旧表到新表去。在处理之前将其分别GroupBy,最后合并按时间排序