拼接多个数据表的时候,在查询结果里的组合栏目里面可能会出现重复的东西。可以这样试一下,在这段查询里面再拼接一个数据表,用 LEFT JOIN 拼接一下 comment 数据表,这个表里的东西是内容相关的评论。用 ON 设置条件,条件是 comment 表里的 postId 等于 post 表里的 id 栏目的值。
执行一下这段查询,你会发现在这个 id=1 的内容数据里面,它的 files 栏目里这个 null 出现了两次。null 说明这个内容没有相关的文件,出现了两次是因为这个内容可能有两条相关的评论。
打开 comment 数据表,观察一下里面的数据记录,这里有两条评论数据它们的 postId 的值都是 1,也就是 id=1 的这个内容有两条评论。
解决这种重复问题,可以使用 DISTINCT 去掉重复,不过 JSON_ARRAYAGG 不支持使用 DISTINCT ,所以我们需要把它换成另一种方法,可以用一下 GROUP_CONCAT ,这个方法也可以把多个值组合成一个值,不过组合的结果不是 JSON 格式的数据。在 file.id 的前面加上 DISTINCT 去掉重复的文件 id 。
执行一下这段查询,这次就解决了重复的问题。 如果内容没有相关的文件,files 的值是个 NULL,如果有相关的文件, files 的值是一组中间用逗号分隔开的文件的 id 。在后面我们会想办法把它转换成 JSON 格式的数据。