Mysql 计算以逗号分隔的字符串的最大出现次数,并打印出现的最大字符串SQL

Mysql 计算以逗号分隔的字符串的最大出现次数,并打印出现的最大字符串SQL,mysql,sql,Mysql,Sql,我有一张这样的桌子: user_id | hobby --------------------------- 2 | A, B , B, B --------------------------- 5 | A, B --------------------------- 7 | A, B, C --------------------------- 9 | A, B, B, A -----------------------

我有一张这样的桌子:

user_id  | hobby   
---------------------------
   2     |  A, B , B, B
---------------------------
   5     |  A, B
---------------------------
   7     |  A, B, C
---------------------------
   9     |  A, B, B, A
---------------------------
预期产出:

user_id  | hobby   
---------------------------
   2     |  B
---------------------------
   5     |  A, B
---------------------------
   7     |  A, B, C
---------------------------
   9     |  A, B
---------------------------
对于用户_id 2,A的出现次数为1,B的出现次数为3。最大值为3,因此打印B

对于用户_id 5,A的出现次数为1,B的出现次数为1。最大值为1,因此A和B都被打印

对于用户_id 7,A的出现次数为1,B的出现次数为1,C的出现次数为1。最大值为1,因此,A、B、C被打印

对于用户_id 5,A的出现是2,B的出现是2。最多2个。所以,A和B都是打印的


您能帮我写下这个预期输出的查询吗?

您可以使用递归cte将字母展平,然后使用
max
分组方式

with recursive cte(i, val, r) as (
   select user_id, substr(hobby, 1, 1), substr(hobby, 4, length(hobby)) from users
   union all
   select i, substr(r, 1, 1), substr(r, 4, length(r)) from cte where length(r) > 0
), s as (select i ind, val v, count(*) c from cte group by i, val)
select ind, (select group_concat(v separator ', ') from s s2 where s2.ind = s1.ind and s2.c = (select max(c) from s s3 where s3.ind = s2.ind)) from s s1 group by ind;
输出:

2   B
5   A, B
7   A, B, C
9   A, B

修正你的数据模型!不要在字符串中存储多个值!你在使用MySQL吗?或者Sqllite?@GordonLinoff实际上我想创建一个视图,在这里我需要这种数据模型。你能帮我写这个查询吗?@johncode-mysqls从来都不需要这种数据模型。在SQL中,从不在一列中存储多个值。将数据正确地存储在第二个表中(外键返回主表),获取所需输出的查询也将变得更简单。此外,这与PHP无关-我已经为您删除了该标记