【问题标题】:Using left join to query and match JSON field in MySQLMySQL中使用左连接查询匹配JSON字段
【发布时间】:2021-02-21 06:04:20
【问题描述】:

表 A,字段:pay_type_fk,类型:json,示例数据:[1,2,4] 表 B,字段:id 类型:bigint 示例数据:主键

我使用的 SQL:

SELECT
    pay_payment_type.id,
    pay_payment_type.pay_name,
    pay_payment_type.configuration,
    pay_payment_type.pay_function_name,
    GROUP_CONCAT( pay_type.MODE ) 
FROM
    pay_payment_type
    LEFT JOIN pay_type ON pay_type.id = CAST( JSON_EXTRACT( pay_payment_type.pay_type_fk, '$[0]' ) AS UNSIGNED ) 
GROUP BY
    pay_payment_type.id

只能找到pay_type表的第一条记录,我想我们可以用group_CONCAT全部查询

【问题讨论】:

  • 您的实际问题是什么?

标签: mysql sql arrays json left-join


【解决方案1】:

如果我没听错,你可以joinJSON_CONTAINS():

select
    ppt.id,
    ppt.pay_name,
    ppt.configuration,
    ppt.pay_function_name,
    group_concat(pt.mode) as pay_type_modes 
from pay_payment_type ppt
left join pay_type pt on json_contains(ppt.pay_type_fk, cast(pt.id as char))
group by ppt.id

也就是说,更好的选择是修复您的设计。您应该有一个单独的桥表来表示这种多对多关系,而不是使用 JSON 数组来存储多个依赖键,并且每个值都位于单独的行中。

【讨论】:

  • 是的..设计中存在问题,但有很多含义。最好不要修改..谢谢~~~~~
  • 函数 json_contains 的参数 1 中 JSON 数据的数据类型无效;需要 JSON 字符串或 JSON 类型。
  • @l0s7r:您的问题表明pay_type_fk 是 JSON。错误信息表明不是这种情况...
猜你喜欢
  • 1970-01-01
  • 2017-04-22
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多