通过匹配单个 table 的多列逗号分隔值来制作多列
make multiple columns by matching multiple column's comma separated values of single table
我有一个 table : 有列的订单:
--------------------------------
id | liquids| strength
--------------------------------
1 | 1,2,3 | 10,12,13
2 | 2,3,4 | 12,13,18
--------------------------------
我想要如下输出:
--------------------------------
id | liquids| strength
--------------------------------
1 | 1 | 10
1 | 2 | 12
1 | 3 | 13
2 | 2 | 12
2 | 3 | 13
2 | 4 | 18
没有自定义程序似乎是不可能的。看看这篇文章:http://kedar.nitty-witty.com/blog/mysql-stored-procedure-split-delimited-string-into-rows
您的 table 结构在数据库世界中不是最优的。在大多数情况下,您应该将数据分隔成行。如果要转换数据库,请使用脚本语言。如果您想即时进行并保持数据原样,请重新考虑转换。它确实有助于对您的数据进行操作。
正如 a_horse_with_no_name 所说,请参阅规范化 - 但类似于下面提供的示例的内容可能是朝着规范化迈出的一步。请注意,在此示例中 ints
是一个简单的 table 整数 (i) 从 0-9,而 my_table
是您的 table.
SELECT id,IF( LENGTH( liquids ) - LENGTH( REPLACE( liquids, ',', '' ) ) + 1 >= i,
SUBSTRING_INDEX(SUBSTRING_INDEX(liquids, ',', i), ',', -1),
''
) +0 liquid,
IF( LENGTH( strength ) - LENGTH( REPLACE( strength, ',', '' ) ) + 1 >= i,
SUBSTRING_INDEX(SUBSTRING_INDEX(strength, ',', i), ',', -1),
''
) +0 strength
FROM my_table,ints HAVING liquid > 0 ;
我有一个 table : 有列的订单:
--------------------------------
id | liquids| strength
--------------------------------
1 | 1,2,3 | 10,12,13
2 | 2,3,4 | 12,13,18
--------------------------------
我想要如下输出:
--------------------------------
id | liquids| strength
--------------------------------
1 | 1 | 10
1 | 2 | 12
1 | 3 | 13
2 | 2 | 12
2 | 3 | 13
2 | 4 | 18
没有自定义程序似乎是不可能的。看看这篇文章:http://kedar.nitty-witty.com/blog/mysql-stored-procedure-split-delimited-string-into-rows
您的 table 结构在数据库世界中不是最优的。在大多数情况下,您应该将数据分隔成行。如果要转换数据库,请使用脚本语言。如果您想即时进行并保持数据原样,请重新考虑转换。它确实有助于对您的数据进行操作。
正如 a_horse_with_no_name 所说,请参阅规范化 - 但类似于下面提供的示例的内容可能是朝着规范化迈出的一步。请注意,在此示例中 ints
是一个简单的 table 整数 (i) 从 0-9,而 my_table
是您的 table.
SELECT id,IF( LENGTH( liquids ) - LENGTH( REPLACE( liquids, ',', '' ) ) + 1 >= i,
SUBSTRING_INDEX(SUBSTRING_INDEX(liquids, ',', i), ',', -1),
''
) +0 liquid,
IF( LENGTH( strength ) - LENGTH( REPLACE( strength, ',', '' ) ) + 1 >= i,
SUBSTRING_INDEX(SUBSTRING_INDEX(strength, ',', i), ',', -1),
''
) +0 strength
FROM my_table,ints HAVING liquid > 0 ;