mysql将两列中的csv连接成 key 对

标签 mysql

我在 MySQL 中有一个表,其中包含两列逗号分隔的数据(呃!),我需要重新格式化该表,以便第一列值的第 n 个索引与第二列值的第 n 个索引匹配

id   | col1        | col2
----------------------------------
1    | a,b,c,d     | a5,3e,7f48,943d44

结果看起来像

results
--------------
a:a5
b:3e
c:7f48
d:943d44

concat、group_concat、find_in_set 等似乎无法胜任这项工作;是否有与 php 的 array_combine() 等效的函数/过程?

最佳答案

如果没有 UDF 或存储过程的帮助,在 MySQL 中没有通用的方法可以做到这一点。但是,在某些假设下,一种近似方法是使用 SUBSTRING_INDEX:

SELECT CONCAT(SUBSTRING_INDEX(col1, ',', 1), ':', SUBSTRING_INDEX(col2, ',', 1)) AS results
FROM yourTable
UNION ALL
SELECT CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(col1, ',', 2), ',', -1), ':',
              SUBSTRING_INDEX(SUBSTRING_INDEX(col2, ',', 2), ',', -1))
FROM yourTable
UNION ALL
SELECT CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(col1, ',', 3), ',', -1), ':',
              SUBSTRING_INDEX(SUBSTRING_INDEX(col2, ',', 3), ',', -1))
FROM yourTable
UNION ALL
SELECT CONCAT(SUBSTRING_INDEX(col1, ',', -1), ':', SUBSTRING_INDEX(col2, ',', -1))
FROM yourTable;

enter image description here

Demo

如果每条记录中始终有 4 个 CSV 项目,则此方法可行。如果没有,那么我们仍然可以使用这种方法,但它会开始变得非常难看。

如果您希望拥有多行数据,并且还希望对输出进行排序,则可以通过向查询添加计算列并执行 ORDER BY 来完成那。但总的来说,MySQL 并不能很好地处理此类 CSV 数据。如果可能,请尝试将 CSV 排除在表之外。

关于mysql将两列中的csv连接成 key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51529955/

相关文章:

MySQL安装: ERROR: Failed to build gem native extension

java - 插入海量数据时的 Hibernate 性能问题

java - 如何刷新绑定(bind)的jTable?

MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中且包含非聚合列

mysql - 有没有办法获取变量并将它们添加为 SQL 中左连接后的列?

php - 在mysql中获取COUNT时循环

具有两个条件内联 SELECT 的 MySQL 查询

MySQL:获取特定日期和总体记录的 COUNT

javascript - 如何解决ajax从php获取数据时只取第一行数据的问题?

php - sql语句没有给出想要的结果