提问者:小点点

MySQL:计数逗号分隔字段中的值


这听起来可能有点愚蠢,但我在Mysql和数据库相关的东西方面没有太多经验。

我有一个名为posts的表,它有一个字段(标记)。 下面是示例数据。

ID, Title,           Tags
1   Friend Title       Friend, School, City
2   College            College, City
3   Work               Work, City, Friend

标签用逗号分隔。

我需要得到这些标签的数量。 我在期待

School - 1
City - 3
College - 1
Work - 1

像这样的。

我知道在提出问题之前,我们需要展示一些代码或查询,但我不知道从哪里开始。 我不是在寻找彻底的解决方案。

只要指导我用什么,然后我就会尝试。

按照Forpas的建议进行编辑,我有一个更多的表,其中包含标签的名称。 这看起来就像下面。

Tagid  Tag      active
1      School    0
2      College   0
3      City      0
4      Home      0
5      Hotel     0

共3个答案

匿名用户

连接表并聚合:

select t.tag, count(p.id) counter
from tags t inner join posts p
on find_in_set(t.tag, p.tags)
group by t.tag

如果posts表的tags列中的逗号后没有空格,则on子句中使用的函数find_in_set()将起作用。 如果有空格,则必须使用replace()删除空格。

请参阅演示。
结果:

| tag     | counter |
| ------- | ------- |
| City    | 3       |
| College | 1       |
| School  | 1       |
| Work    | 1       |

匿名用户

使用WITH,仅在mysql8.0+中工作:

with tags as (
 select 'School' as tag union 
 select 'City' union 
 select 'College' union 
 select 'Work') 
select tag, count(*) from (
  select tag 
  from tags
  left join posts on instr(posts.tags,tags.tag)>0
) x
group by tag
;

匿名用户

根据你有多少标记,如果你只有几个标记,你可以为每个标记创建一个整数变量,然后创建一组if语句,这样就可以在有标记名的变量上加1。