Mysql如何通过'[id,anotherId]'格式加入相关表
Posted
技术标签:
【中文标题】Mysql如何通过\'[id,anotherId]\'格式加入相关表【英文标题】:Mysql how to join related table by '[id, anotherId]' formatMysql如何通过'[id,anotherId]'格式加入相关表 【发布时间】:2021-12-11 12:51:45 【问题描述】:我有一个带有字段 related_table_ids 的表(示例值 ["1110663703","1958153258"]
)。
尝试通过查询连接相关表 -
SELECT *
FROM db.table
INNER JOIN related_table ON related_table.id IN (
SUBSTRING(table.related_table_ids, 2, (LENGTH(table.related_table_ids) - 2))
)
但这不起作用,返回 0 行。请帮忙!
表格
id | related_table_ids
---------
1 | ["1110663703","1958153258"]
2 | ["2032453865"]
3 | ["1304031696"]
related_table
id
---------
1110663703
1958153258
2032453865
1304031696
【问题讨论】:
为table
提供 CREATE TABLE 脚本。 related_table_ids
列是 JSON 类型的列吗?
是的,列是 json。 dbfiddle
有问题。 JSON 数组中的值是字符串,而 related_table 中的值是整数。所以你不能在数组中搜索值,数据类型不会被转换,而是在常规比较中,来自 related_table 的值必须转换为字符串并用 dquote 字符包装,这会降低性能。我建议您将 JSON 数组元素转换为数字(删除所有 dquote 字符),这将允许在 JSON_CONTAINS 中直接比较。 dbfiddle.uk/…
无论如何这会因为笛卡尔而变慢 - MariaDB 没有实现 JSON 数据类型,并且它没有多值索引。 MariaDB 也没有 JSON_TABLE 函数。您可以测试下一个 - 将 JSON 数组解析为递归 CTE 中的单个值,然后加入 - 此方法至少可以使用related_table (id)
的索引...
【参考方案1】:
related_table_ids
看起来像一个 json 字符串。因此,您可以使用JSON_CONTAINS 函数。
SELECT *
FROM mytable t
JOIN related_table rt ON JSON_CONTAINS(related_table_ids, CONCAT('"', rt.id, '"'))
db<>fiddle
【讨论】:
这似乎应该工作,但我得到了无限的查询处理。 dbfiddle 是正确的。 这不是无限处理,只是很多行。但在迁移中我收到错误 - “一般错误:4037 JSON 文本在参数 1 中意外结束到函数 'json_contains'” 查询 -UPDATE table JOIN related_table ON JSON_CONTAINS(table.related_table_ids, CONCAT('\"', related_table.id, '\"')) SET table.field = related_table.field
;
谢谢!有带有值的字段 - ''。我通过CASE WHEN related_table_ids = '' THEN '[]' ELSE related_table_ids END
解决了这个问题。以上是关于Mysql如何通过'[id,anotherId]'格式加入相关表的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 id 在 MySQL 中的 json 整数数组列中获取相关项目
如何通过mysql或python将数据插入到另一个具有相同id的表中