微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我的目标是如何获得在json数组中具有对其他引用的列之间的关系。以简化的方式,我有两个表:

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" |

因此,我想获取与表A的某项相关的所有表B,其ID为ID,例如1,其ID在列中引用整数数组(如JSON)。

类似这样的东西:

|-----|----------|
| 1   | "item 1" |
| 3   | "item 3" |

我一直在尝试使用docs中的 json_contains json_extract json_search 等来实现这一目标,我认为问题在于匹配json整数数组内的值的方式。

例如:

SELECT JSON_SEARCH((select references from table_a where 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'),'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),'3');

要测试的沙盒:https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=ac557666852fa94e77fdf87158c9abe0

解决方法

不正确(但已通过JSON_VALID函数成功检查)的JSON。

解决方案太可怕了

SELECT table_b.*
FROM table_a,table_b
WHERE table_a.id = 1
  AND JSON_SEARCH(REPLACE(REPLACE(REPLACE(REPLACE(table_a.references,'"',''),'[','["'),']','"]'),','","'),'one',table_b.id) IS NOT NULL

fiddle和一些其他查询来解释问题。

,

您可以使用下一个查询作为解决方案:

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_CONTAINS函数。

尝试here

,

您可以先删除使用引号包裹数组的引号,然后将结果整数与import { MatIconModule } from '@angular/material/icon' 子字符串连接在一起,并使用辅助子查询(其中一个生成行)以连续获取数组的每个成员,例如

item_

Demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。