mysql - 如何从 MySQL 表中的连接字段创建新记录

标签 mysql sql

我有一个表“案例”,其中包含一个名为“标签”的字段字符串字段,其中包含由 | 分隔的标签。特点:
案例

+----+-------------------+   
| Id |       Tags        |  
+----+-------------------+  
| 12 | "car|plane|truck" |  
| 11 | "plane"           |  
+----+-------------------+  
我想创建一个新表来映射这些标签,如下所示:
标签
+----+---------+-------+  
| Id | case_id |  tag  |  
+----+---------+-------+  
|  1 |      12 | car   |  
|  2 |      12 | plane |  
|  3 |      12 | truck |  
|  4 |      11 | plane |  
+----+---------+-------+  
如上所述,如何编写 sql 语句来创建表上的每条记录?
谢谢!

最佳答案

解决方案有点复杂:

set @id = 0;
select 
    @id:=(@id + 1) as id,
    id as case_id,
    JSON_UNQUOTE(
      JSON_EXTRACT(
        CONCAT('["', REPLACE(tags, '|', '", "'), '"]'), -- format string as JSIN array
        CONCAT('$[',pos,']')
      )
    ) tag
from Tags
join JSON_TABLE( -- join series pseudo table
    "[0,1,2,3]", -- this array length must be equal max tag elements length 
    "$[*]" 
    COLUMNS(pos varchar(255) PATH '$')
) as seq
    on seq.pos<JSON_LENGTH(CONCAT('["', REPLACE(tags, '|', '", "'), '"]'))
;
DB Fiddle example
id  case_id     tag
1   11          plane
2   12          car
3   12          plane
4   12          truck
附注此解决方案仅适用于 MySQL 8

关于mysql - 如何从 MySQL 表中的连接字段创建新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63061875/

相关文章:

php - SQL 数据库中用户名的默认值

php - Doctrine 2 映射引用唯一键

mysql - HQL select 子句中的关联子查询

java - 连接字符串作为 GET/POST 请求的参数

php - 有没有办法在 MySQL 结果集中生成 "fake"行?

PHP 使用 PDO 将图像上传到 mysql 数据库?

sql - Select 和 View 之间的执行计划差异

sql - Oracle 数据库 : getting time from total amount of minutes from the beginning of a day

sql - 将我们所有的 SQL、NoSQL 数据复制到 Snowflake 后,有没有办法在数百个表、Json 和其他数据中检测 "relationships"?

php - 从先前生成的结果集中获取值(value)