MySQL计数表值以逗号分隔

时间:2019-11-17 10:21:55

标签: mysql

我的桌子看起来像这样

my_table

我需要结果像

expected_result

请注意,有时候我的表中有一个值,然后是“,”,然后是另一个值,有时是值,然后是“,”,然后是空格,然后是值,还有一些空值

3 个答案:

答案 0 :(得分:0)

这将涉及一系列步骤。
假设您的记录如表1所示-

+-------------------------------+ | title | +-------------------------------+ | sales,marketing,operations | | sales | | operations,project management | | sales,operations | | | | , | +-------------------------------+

第1步:创建临时表-
create temporary table temp( val char(255) );

第2步:动态创建sql语句 set @sql=concat("insert into temp (val) values ('", replace(( select group_concat(title) as t from table1), ",", "'),('"),"');");

第3步:准备SQL语句 prepare stmt1 from @sql;

第4步:执行上面创建的SQL语句 execute stmt1;

第5步:在SQL下运行以具有所需的输出- select val, count(val) from temp group by val having val!=""

输出-
+--------------------+------------+ | val | count(val) | +--------------------+------------+ | marketing | 1 | | operations | 3 | | project management | 1 | | sales | 3 | +--------------------+------------+

答案 1 :(得分:0)

另一个答案-

如果标题的值有限,请尝试对每个标题使用以下sql。

SELECT 'sales', SUM(ROUND((LENGTH(title)- LENGTH(REPLACE(title, "sales", "")) ) / LENGTH("sales"))) ASFROM table1;

输出-
+-------+-------+ | sales | count | +-------+-------+ | sales | 3 | +-------+-------+

显然,这会影响性能,但可以节省表创建特权。

答案 2 :(得分:0)

通过以下选择,您可以在逗号分隔的列中的所有行中获取所有值,并且可以使用ot进行所需的任何操作。这也可以在mysql 5.x版本上运行。

如果您的列中的单词数超过6个,则如果内部连接,则必须扩大rifgt视域

SELECT
  SUBSTRING_INDEX(SUBSTRING_INDEX(title, ',', n.digit+1), ',', -1) title
FROM
  table1
  INNER JOIN
  (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL 
    SELECT 3  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) n
  ON LENGTH(REPLACE(title, ',' , '')) <= LENGTH(title)-n.digit;

给你

title
sales
sales
operations
sales
marketing
project management
operations
operations

还有

SELECT
  SUBSTRING_INDEX(SUBSTRING_INDEX(title, ',', n.digit+1), ',', -1) title, Count(*)
FROM
  table1
  INNER JOIN
  (SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) n
  ON LENGTH(REPLACE(title, ',' , '')) <= LENGTH(title)-n.digit
  GROUP BY SUBSTRING_INDEX(SUBSTRING_INDEX(title, ',', n.digit+1), ',', -1);

您得到

title               Count(*)
sales               3
operations          3
marketing           1
project management  1

dbfiddle示例https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=a3f5dc5f7b31f0270d595d2635a99a08