【问题标题】:How to count occurrence of a substring in a comma separated string in MySQL如何计算 MySQL 中逗号分隔字符串中子字符串的出现次数
【发布时间】:2020-09-28 07:56:41
【问题描述】:

假设我选择了这样的记录

+----+-------------------------------------------------------------------------------------
| id | groupedStatus                                                                      |
+----+-------------------------------------------------------------------------------------
| 1 | received,accepted,discarded,discarded,accepted,discarded,accepted,received,received |
| 2 | accepted,discarded,received,received,received,received,received                     |          
+----+-------------------------------------------------------------------------------------

除了上面的记录,我还想得到groupedStatus字符串中每个子字符串的出现,

例如,在第一行,出现如下:

收到:3 接受:3 丢弃:3

原始表架构

表1

ID int

表 2:

ID
Table1ID
Status enum('received','accepted','discarded') 

我正在使用以下查询选择上述记录

select t1.id, group_concat(t2.status) as groupedStatus from Table1 t1 inner join Table2 t2 on t1.id=t2.table1ID group by t1.id

【问题讨论】:

  • 永远不要将数据存储为逗号分隔的项目。只会给你带来很多麻烦。
  • 我没有将数据存储为逗号分隔值,这是group_concat的结果
  • @AmirSaleem:请出示您的原始数据并查询。 before 字符串聚合之后,你想要的东西会容易得多。
  • @AmirSaleem,问一个新问题! (附表数据和预期结果。)
  • 我认为你在这里错过了一个技巧:-(

标签: mysql sql string group-by pivot


【解决方案1】:

您可以使用条件聚合来做到这一点,如下所示:

select 
    t1.id, 
    sum(t2.status = 'received')  as received,
    sum(t2.status = 'accepted')  as accepted,
    sum(t2.status = 'discarded') as discarded,
    group_concat(t2.status) as groupedStatus 
from table1 t1 
inner join table2 t2 on t1.id = t2.table1ID 
group by t1.id

【讨论】:

  • 为此+1,我使用的是(CHAR_LENGTH(group_concat(case when t2.status = "received" then t2.status else null end)) - CHAR_LENGTH(REPLACE(group_concat(case when t2.status = "received" then t2.status else null end), ',', '')) + 1) as receivedCount,但你的更简单
猜你喜欢
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 2020-02-21
  • 2012-02-12
  • 2015-07-19
  • 1970-01-01
相关资源
最近更新 更多