Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL选择逗号分隔的不同值的计数_Mysql - Fatal编程技术网

MYSQL选择逗号分隔的不同值的计数

MYSQL选择逗号分隔的不同值的计数,mysql,Mysql,如何从MySql中以逗号分隔的值存储的数据中选择不同的值和相对计数 表中的数据如下所示: "Category" "Values" "red" "D,A,D,D" "yellow" "A,A,D,D" 期望输出: "red" "D" "3" "red" "A" "1" "yellow" "D" "2" "yellow" "A" "2" 你能想出一个在mysql中像我这样获得输出的好方法吗? 提前感谢。使用派生表

如何从MySql中以逗号分隔的值存储的数据中选择不同的值和相对计数

表中的数据如下所示:

"Category"    "Values"    
"red"         "D,A,D,D"    
"yellow"      "A,A,D,D"
期望输出:

"red"    "D" "3"    
"red"    "A" "1"    
"yellow" "D" "2"    
"yellow" "A" "2"
你能想出一个在mysql中像我这样获得输出的好方法吗?
提前感谢。

使用派生表可以将字符串拆分为行

SELECT `Category`, SUBSTRING_INDEX(SUBSTRING_INDEX(t.`Values`, ',', n.n), ',', -1) `value`
FROM table1 t 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(t.`Values`) - LENGTH(REPLACE(t.`Values`, ',', '')))

是的,我能想到的一个好方法是对表格进行规范化,使其成为一对多,之后的生活将变得简单。只要您知道可能值的上限,这将很有效,在本例中为9。很好的解决方案。
SELECT `Category`, `value`, COUNT(*) as cnt
FROM (
    <previous query>
   ) T
GROUP BY  `Category`, `value`