【问题标题】:How to return DISTINCT values in a JSON_ARRAYAGG when using JSON_OBJECT使用 JSON_OBJECT 时如何在 JSON_ARRAYAGG 中返回 DISTINCT 值
【发布时间】:2022-07-24 20:16:23
【问题描述】:

如何将 DISTINCT 与 JSON_ARRAYAGG 一起使用?

让我们以下面的查询为例。

SELECT 
    staff.company,
    JSON_ARRAYAGG(
        JSON_OBJECT(
            'uuid', UuidFromBin(staff.uuid),
            'username', staff.username,
            'name', staff.name,
            'surname', staff.surname
        )
    )
FROM events_staff
JOIN staff ON staff.id = staff_id
LEFT JOIN skills s ON s.id = events_staff.skill_id
GROUP BY staff.company

现在,如何在此查询中将 DISTINCT 与 JSON_ARRAYAGG 一起使用,以使 JSON 对象不同?如果我们可以根据 uuid 之类的任何键应用 DISTINCT,那就更好了。

谷歌搜索半小时后,我找到了以下选项,但无法在上述查询中应用这些选项。

JSON_ARRAYAGG DISTINCT 返回一个 JSON 数组,该数组由所有 所选行中 string-expr 的不同(唯一)值: JSON_ARRAYAGG(DISTINCT col1)。 NULL string-expr 不包含在 JSON 数组。 JSON_ARRAYAGG(DISTINCT BY(col2) col1) 返回一个 JSON 仅包含记录中的那些 col1 字段值的数组,其中 col2 值是不同的(唯一的)。但是请注意,不同的 col2 values 可能包含一个 NULL 作为不同的值。

【问题讨论】:

  • 请发布样本数据。顺便问一下,与skills 表进行左连接的目的是什么?我没有看到它在查询中的任何地方使用。
  • 我已删除其他选择,以便该问题专门用于实际查询。
  • 这可以理解,但您仍然没有发布数据样本。无论如何,我认为JSON_ARRAYAGG(DISTINCT col1) IF 没有任何问题,col1 实际上是一个存储有效 JSON 值的列。你的col1 基本上是从几个不同的列生成的 JSON 值,我猜因为你是按company 分组的,所以你的结果返回了重复的staff。我建议您在执行JSON_TABLE() 之前在列上应用DISTINCT,然后只有您执行JSON_ARRAYAGG() - 甚至可能不包括DISTINCT

标签: mysql distinct mysql-5.7 json-arrayagg


【解决方案1】:

我想出了一个解决方法来解决这个问题,首先解决使用JSON_ARRAYAGG(DISTINCT JSON_OBJECT()) 根本不起作用的问题。

所以解决方法是CONCAT('[', GROUP_CONCAT(DISTINCT JSON_OBJECT("key": value)), ']');,这将导致类似[ {"key": <value1>},{"key":<value2>}, ...] 的结果。这将返回不同的结果。

注意:最后你可能需要将它转换为 JSON,这可以这样完成 => CAST(CONCAT('[', GROUP_CONCAT(JSON_OBJECT("key": value)), ']') AS JSON);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2016-08-22
    • 2012-10-07
    相关资源
    最近更新 更多