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]'格式加入相关表的主要内容,如果未能解决你的问题,请参考以下文章

如何查看MySQL connection id连接id

如何通过 id 在 MySQL 中的 json 整数数组列中获取相关项目

加入几个可选的匹配查询

如何通过mysql或python将数据插入到另一个具有相同id的表中

如何使用 Node.js 查询 mysql 数据库以通过 url 中的名称获取特定用户(字段),而不仅仅是通过 ID

Mysql通过ID从另一个表中删除一个表