MySQL:将逗号分隔列表拆分为多行

And*_*eKR 17 mysql sql delimiter delimiter-separated-values

我有一个非标准化的表,其中一列包含逗号分隔列表,该列表是另一个表的外键:

+----------+-------------+   +--------------+-------+
| part_id  | material    |   | material_id  | name  |
+----------+-------------+   +--------------+-------+
|      339 | 1.2mm;1.6mm |   |            1 | 1.2mm |
|      970 | 1.6mm       |   |            2 | 1.6mm |
+----------+-------------+   +--------------+-------+
Run Code Online (Sandbox Code Playgroud)

我想将这些数据读入一个不提供过程语言的搜索引擎.

那么,有没有一种方法,要么做一个加入此列运行该数据插入相应的条目到一个新表的查询?结果数据应如下所示:

+---------+-------------+
| part_id | material_id |
+---------+-------------+
|     339 |           1 |
|     339 |           2 |
|     970 |           2 |
+---------+-------------+
Run Code Online (Sandbox Code Playgroud)

如果DBMS支持函数返回一个表但MySQL显然没有,我可以想到一个解决方案.

小智 13

在MySQL中,这可以通过以下方式实现

SELECT id, length FROM vehicles WHERE id IN ( 117, 148, 126) 

+---------------+
| id  | length  |
+---------------+
| 117 | 25      |
| 126 | 8       |
| 148 | 10      |
+---------------+

SELECT id,vehicle_ids FROM load_plan_configs WHERE load_plan_configs.id =42

+---------------------+
| id  | vehicle_ids   |
+---------------------+
| 42  | 117, 148, 126 |
+---------------------+
Run Code Online (Sandbox Code Playgroud)

现在要获得逗号分隔的vehicle_ids的长度,请使用以下查询

Output

SELECT length 
FROM   vehicles, load_plan_configs   
WHERE  load_plan_configs.id = 42 AND FIND_IN_SET(
       vehicles.id, load_plan_configs.vehicle_ids
)

+---------+
| length  |
+---------+
| 25      |
| 8       |
| 10      |
+---------+
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请访问http://amitbrothers.blogspot.in/2014/03/mysql-split-comma-separated-list-into.html


Jon*_*ack 5

我已经在很多天里回答了两个类似的问题,但没有任何回复,所以我猜人们因使用光标而被推迟,但因为它应该是一个一个过程我个人认为不重要.

正如你所说,MySQL不支持表返回类型,所以你除了循环表并解析材料csv字符串并为部件和材料生成适当的行之外别无选择.

以下帖子可能会引起关注:

为post php mysql拆分关键字

MySQL程序将数据从登台表加载到其他表.需要在此过程中拆分多值字段

RGDS

  • 这是因为糟糕的数据库设计导致了糟糕的程序修复:P (2认同)