我的问题类似于这篇文章: "Reverse GROUP_CONCAT" in MySQL?
然而,有没有办法将字符串拆分成自己的列,而不是反转group_concat
:
id | colors1 | color 2 | color 3 | color 4
+----+-----------------------------+---------+----------
| 1 | Red | Green | Blue | Black
| 2 | Orangered | Periwinkle | Black |
| 3 | Orange | Black | |
我也看过这篇文章: How to split the name string in mysql?
但我无法弄清楚如何获得我需要的输出。
答案 0 :(得分:3)
这可能是您要查找的查询:
第一个表结构:
CREATE TABLE color (
id int AUTO_INCREMENT,
col_type varchar(255),
PRIMARY KEY (id)
);
INSERT INTO color (col_type)
VALUES(
'GREEN,RED,BLACK'
);
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(col_type, ',', 1), ',', -1) AS first_color,
If( length(col_type) - length(replace(col_type, ',', ''))>1,
SUBSTRING_INDEX(SUBSTRING_INDEX(col_type, ',', 2), ',', -1) ,NULL)
as second_color,
SUBSTRING_INDEX(SUBSTRING_INDEX(col_type, ',', 3), ',', -1) AS last_color
FROM color
结果是 first_color | second_color | third_color 强> 绿色| RED | BLACK 小提琴enter link description here
但是对于超过3种颜色和每种颜色按照自己的顺序,我认为波纹管查询是正确的。
SELECT
COLOR,
SUBSTRING_INDEX(SUBSTRING_INDEX(COLOR, ',', 1), ',', -1) AS first_color,
If( length(COLOR) - length(replace(COLOR, ',', ''))>=1,
SUBSTRING_INDEX(SUBSTRING_INDEX(COLOR, ',', 2), ',', -1) ,NULL)
as second_color,
If( length(COLOR) - length(replace(COLOR, ',', ''))>=2,
SUBSTRING_INDEX(SUBSTRING_INDEX(COLOR, ',', 3), ',', -1) ,NULL)
AS third_color,
If( length(COLOR) - length(replace(COLOR, ',', ''))>=3,
SUBSTRING_INDEX(SUBSTRING_INDEX(COLOR, ',', 4), ',', -1) ,NULL)
AS fourth_color
FROM COLOR;
知道COLOR字段中可以执行的最大连接数
select (length(COLOR) - length(replace(COLOR, ',', '')) as NumColors
然后使用循环根据表中的最大颜色数生成查询的if部分。 小提琴here