mysql 如何过滤表中json列中的数据

5lhxktic  于 2023-04-05  发布在  Mysql
关注(0)|答案(1)|浏览(173)

我有一个表candidate

id | name | info

|---|------|--------------------------------------------------------------

 1  | apps | \[{"exp": "1","skill": "python"},{"exp": "2","skill": "c" }\]

 2  | Ravi | \[{"exp": "1","skill": "python"},{"exp": "1","skill": "java" }\]

我需要使用索引查询和过滤skill =“python”和exp =“1”的候选人。
我试图在MySql 8.0.32中添加一个列并在表上添加一个索引:

ALTER TABLE candidate

ADD exp_skills_json JSON GENERATED ALWAYS AS (JSON_ARRAYAGG(JSON_OBJECT('skill', info-\>\>'$.skill', 'exp', info-\>\>'$.exp'))) VIRTUAL,ADD INDEX idx_exp_skills_json ((exp_skills_json));

但是,我得到了一个错误代码1111。
如何添加索引以使查询有效执行?

0lvr5msh

0lvr5msh1#

在MySQL中,你不能在JSON对象数组上创建索引。
最接近的方法是在MySQL 8.0中,在相同类型标量的JSON数组上创建多值索引。但这不适用于您显示的示例,这是一个对象数组。
在您显示的示例中,JSON对象都具有相同的字段expskill。您应该创建第二个表,其中列为expskill,并在每行存储一对。

CREATE TABLE candidate_skills (
  candidate_id INT NOT NULL,
  skill VARCHAR(20) NOT NULL,
  exp INT NOT NULL,
  PRIMARY KEY (candidate_id, skill),
  KEY (exp, skill),
  FOREIGN KEY (candidate_id) REFERENCES candidate(id)
);

没有理由在您展示的示例中使用JSON,并且不可能使用索引对其进行优化。

相关问题