SumireHina Ri0n72Y Code Farmer, Idea/Trash Creator

Gorm复杂SQL - 连表,Group,查找最后一个数据

» 开发

业务场景:需要获取某个用户的被点赞记录,将这个业务逻辑合并到一条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,最后合并按时间排序