解开 MySQL 中 GROUP_CONCAT 逆运算的谜团
在数据操作领域,GROUP_CONCAT 函数在将多个值连接成一个值方面占据着统治地位。单字符串。然而,将连接的字符串拆分为单个值的逆操作提出了挑战。
手头的问题
考虑一个场景,其中您有一个表“颜色” “数据结构如下:
+----+----------------------+ | id | colors | +----+----------------------+ | 1 | Red,Green,Blue | | 2 | Orangered,Periwinkle | +----+----------------------+
您的目标是将这些数据转换为更细粒度的数据格式:
+----+------------+ | id | colors | +----+------------+ | 1 | Red | | 1 | Green | | 1 | Blue | | 2 | Orangered | | 2 | Periwinkle | +----+------------+
解决方案:深入 SQL
要实现这种数据变形,您可以利用 SUBSTRING_INDEX 函数的强大功能。这个多功能函数允许您根据分隔符提取特定的子字符串。
SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(colors, ',', n.digit+1), ',', -1) color FROM colors INNER JOIN (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n ON LENGTH(REPLACE(colors, ',' , '')) <= LENGTH(colors)-n.digit ORDER BY id, n.digit
揭示查询背后的机制
外部查询选择“id”列并使用两次嵌套的 SUBSTRING_INDEX 函数来隔离所需的子字符串。第一次调用 SUBSTRING_INDEX 提取第 (n.digit 1) 个逗号之前的子字符串,而第二次调用则提取第 (n.digit 1) 个逗号之后到字符串末尾的子字符串。
带有子查询的 INNER JOIN 确保 SUBSTRING_INDEX 函数应用于最多 4 个子字符串,如中的“digit”列所定义子查询。要支持更多子字符串,请相应地调整子查询。
最后,ORDER BY 子句按“id”对结果进行排序,然后按每行的子字符串的数字顺序对结果进行排序。
演示和制作人员
有关实际演示,请访问参考中链接的小提琴提供。
参考文献
[从逗号分隔列表中提取多个值](https://www.data-generator.com/fiddle/d3c78f201137b4b56a63a95332b8106b)
以上是如何反转 MySQL 的 GROUP_CONCAT:将连接的字符串拆分为单独的值?的详细内容。更多信息请关注PHP中文网其他相关文章!