按照这个问题: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
欢迎提出任何想法!