按逗号分隔的字符串中的单词分组

时间:2015-03-17 02:14:21

标签: mysql

在MySQL中,给出下表,其中Tags是包含逗号分隔字符串的列

Id    Name    Salary    Tags
----------------------------
1     James   5000      Sales, Marketing
2     John    4000      Sales, Finance
3     Sarah   3000      HR, Marketing, Finance

我们怎样才能获得标签中每个单词/标签的总和(薪水)?所以结果会是这样的吗?

Tag          TotalSalary
------------------------
Sales        9000
Marketing    8000
Finance      7000
HR           3000

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

虽然我强烈建议您规范化您的数据结构而不是存储以逗号分隔的列表,但这里有一个方便的方法,即使用"数字"表:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(tags, ',', n.n), ',', -1) value, sum(salary)
FROM tags CROSS JOIN 
(
   SELECT a.N + b.N * 10 + 1 n
     FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
   ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
    ORDER BY n
) n
WHERE n.n <= 1 + (LENGTH(tags) - LENGTH(REPLACE(tags, ',', '')))
GROUP BY SUBSTRING_INDEX(SUBSTRING_INDEX(tags, ',', n.n), ',', -1)

这可以利用substring_index,最多可以支持100个分隔项目 - 可以根据需要轻松调整。我已经多次使用过这种方法,效果很好 - 我第一次看到它在this post中使用过。