【问题标题】:MySQL Query select concat on json field idsMySQL Query select concat on json field ids
【发布时间】:2021-01-07 20:08:29
【问题描述】:

我有这两张桌子

表 1:“身份”

ID | identifier | report_ids
------------------------------
1  | TOP        | ["1","2"]

“report_ids”是一个 VARCHAR 列,而不是 JSON

表 2:“报告”

ID | name
------------------------------
1  | Report Food
2  | Report Beverage

我必须从表 Identity 中选择并加入表 Reports 以通过他的 id 获取名称

总之,我希望通过查询得到这个结果:

Result:
ID | identifier | report_names
--------------------------------
1  | TOP        | Report Food, Report Beverage

我如何使用 Query 做到这一点?

在此先感谢 :)

【问题讨论】:

  • 什么是精确的 MySQL 版本? “report_ids”是一个 VARCHAR 列,而不是 JSON 没关系 - 如果它是有效的 JSON,那么它可以用作 JSON 函数中的参数。
  • 我的版本是:10.4.10-MariaDB,我有varchar,因为并非所有时间这个值都是json,但我认为它可以转换为json no?
  • 如果是这样,您必须显示“不是 JSON 的值”,并说明此类行需要什么输出。或者您可能只需要处理那些包含有效 JSON 值的行?
  • 第二个,我只需要处理那些包含有效 JSON 值的行
  • Anycase - MariaDB 不实现 JSON_TABLE 函数或类似函数 - 因此您需要在迭代 CTE 中从 JSON 中提取单独的值,然后加入第二个表并使用 GROUP_CONCAT 重建您需要的单个 CSV 值。或者,您可以使用" 引用reports.id 并在identity.reprots_id 中搜索。

标签: mysql json join concatenation


【解决方案1】:

寻找

SELECT i.id, i.identifier, GROUP_CONCAT(r.name)
FROM Identity i
JOIN Reports r ON LOCATE(CONCAT('"', r.id, '"'), i.report_ids)
GROUP BY i.id, i.identifier
-- WHERE JSON_VALID(i.report_ids)

【讨论】:

    【解决方案2】:

    接受的答案很棒。但是,要完成,并且由于这个问题被标记为“mysql”,我想用 MySQL 8.0 添加解决方案(因为这与another question 非常相似)。

    如 cmets 中所述,可以使用 JSON_TABLE,使用 JSON_ARRAYAGG 可以直接在结果中处理 JSON:

    SELECT i.id, i.identifier, JSON_ARRAYAGG(reports.name)
    FROM identity as i
        JOIN JSON_TABLE(i.report_ids, '$[*]' COLUMNS (id INT PATH '$')) AS r 
        JOIN reports ON reports.id = r.id
    GROUP BY i.id, i.id, i.identifier;
    

    结果(不确定需要哪个 ID):

    +----+------------+------------------------------------+
    | id | identifier | JSON_ARRAYAGG(reports.name)        |
    +----+------------+------------------------------------+
    |  1 | TOP        | ["Report food", "Report Beverage"] |
    +----+------------+------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-17
      • 2012-06-27
      • 2011-04-13
      • 1970-01-01
      • 2021-11-28
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多