如何在MySQL中通过json整数数组列中的id获取相关项
我的目标是如何获得json数组中具有引用的列与另一列之间的关系。简单地说,我有两个表:如何在MySQL中通过json整数数组列中的id获取相关项,mysql,json,mysql-json,Mysql,Json,Mysql Json,我的目标是如何获得json数组中具有引用的列与另一列之间的关系。简单地说,我有两个表: table_a | id | references | |-----|------------| | 1 | "[1,3]" | | 2 | "[2,3]" | 其引用是由整数和表b组成的json数组 table_b | id | name | |-----|----------| | 1 | "item 1"
table_a
| id | references |
|-----|------------|
| 1 | "[1,3]" |
| 2 | "[2,3]" |
其引用是由整数和表b组成的json数组
table_b
| id | name |
|-----|----------|
| 1 | "item 1" |
| 2 | "item 2" |
| 3 | "item 3" |
因此,我想获取表B中与id为的表A中的一个项相关的所有项,例如,列中id为json的1引用整数数组
大概是这样的:
|-----|----------|
| 1 | "item 1" |
| 3 | "item 3" |
我一直试图通过json_contains、json_extract、json_search等实现这一点,我认为问题在于如何匹配json整数数组中的值
例如:
选择JSON_search从表_a中选择引用,其中id=1,'one','3'
必须返回一些东西,但总是返回NULL,我不明白的方式。我也试过用3个不带引号的词
有什么想法吗
我目前的MySQL版本是5.7.25
提前谢谢
要复制的最小代码:
select version();
CREATE TABLE `table_a` (
`id` int(11) NOT NULL,
`references` json NULL
);
CREATE TABLE `table_b` (
`id` int(11) NOT NULL,
`name` text NULL
);
INSERT INTO `table_a` (`id`, `references`) VALUES
(1, '\"[1,3]\"'),
(2, '\"[2,3]\"');
INSERT INTO `table_b` (`id`, `name`) VALUES
(1, 'item_1'),
(2, 'item_2'),
(3, 'item_3');
SELECT * from table_a;
SELECT * from table_b;
select `references` from table_a where id=1;
SELECT JSON_SEARCH((select `references` from table_a where id=1), 'one', '3');
要测试的沙盒:不正确,但通过JSON\u有效函数JSON成功检查 解决方案是可怕的: 选择表b* 从表a到表b 其中,表_a.id=1 JSON_searchreplacetable_a.references、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、表_b.id不为空
通过一些解释问题的附加查询。您可以使用下一个查询作为解决方案:
select
table_a.*,
table_b.*
from table_a
join table_b on JSON_CONTAINS(
CAST(TRIM('"' FROM `references`) as JSON),
CAST(table_b.id as JSON)
)
where table_a.id=2;
因为您的references字段不是有效的JSON类型,所以需要将其转换为JSON,然后才能使用JSON_包含的函数
试试看您可以先去掉环绕数组的引号,然后使用辅助子查询将结果整数与item_uu子字符串连接起来,其中一个子查询生成行,以便连续获取数组的每个成员,例如
SELECT b.*
FROM
(
SELECT @i := @i + 1 AS rn,
CONCAT('item_',JSON_EXTRACT(JSON_UNQUOTE(`references`),
CONCAT('$[',@i-1,']'))) AS name
FROM information_schema.tables
CROSS JOIN `table_a` AS a
CROSS JOIN (SELECT @i := 0) r
WHERE @i < JSON_LENGTH(JSON_UNQUOTE(`references`)) ) AS a
JOIN `table_b` AS b
ON b.`name` = a.name
将源数据显示为创建表+插入脚本或创建在线小提琴。以格式化文本表的形式显示所需的输出。为什么要使用json数组而不是常规的、规范化的模式?@Akina我已经更新了它。@我知道。但这是目前数据模型的要求。如果达不到这一点,我将对其进行重构。我看不到预期的结果。。