MySQL:具有嵌套选择和 DISTINCT 的重复项

时间:2021-01-19 18:28:36

标签: mysql join distinct

按照这个问题:Remove duplicates on MySQL JOIN query on JSON_ARRAYAGG with INNER JOIN

我有一个用户使用的应用程序;用户可以创建书签,每个书签可以有多个标签,也可以是私有的。

所以,如果我没记错的话:user =* bookmark *=* tag

我想用他们在书签中使用的标签来检索用户。但是,有一个细节:我们将在查询中使用 @SESSION_ID:如果书签是私有的并且创建它的用户不是 @SESSION_ID 中的用户,请不要返回它;否则这样做:

SELECT
  `user`.`id`,
  (
    SELECT
      JSON_ARRAYAGG(
        JSON_OBJECT(
          'id', subQuery.id,
          'name', subQuery.name
        )
      )
      FROM (
        SELECT DISTINCT
        tag.id,
        tag.name,
        bookmark.user_id,
        bookmark.isPrivate
        FROM tag
        INNER JOIN bookmark_tag ON bookmark_tag.tag_id = tag.id
        INNER JOIN bookmark ON bookmark.id = bookmark_tag.bookmark_id
        INNER JOIN `user` ON user.id = bookmark.user_id
      ) subQuery
      WHERE user.id = subQuery.user_id
      AND
        (
         subQuery.isPrivate IS NOT TRUE
         OR
         subQuery.user_id = @SESSION_ID
        )
  ) AS tags
    FROM `user`
  GROUP BY `user`.`id`
;

如您所见,如果书签不是私有的或 @SESSION_ID 与 bookmark.user_id 中的用户不匹配,则不会有重复;但如果书签是私有的且 @SESSION_ID 匹配,则会返回一些重复项。

这是一个小提琴:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=7ae76ba61c5870c3a9f31d9564538fa1

欢迎提出任何想法!

0 个答案:

没有答案