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

如何在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"

我的目标是如何获得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" |
因此,我想获取表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我已经更新了它。@我知道。但这是目前数据模型的要求。如果达不到这一点,我将对其进行重构。我看不到预期的结果。。