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

MySQL:从字段中计算逗号分隔的值,mysql,Mysql,这听起来可能有点愚蠢,但我在Mysql和数据库相关方面没有太多经验 我有一个名为posts的表,它有一个字段(标记)。下面是示例数据 ID, Title, Tags 1 Friend Title Friend, School, City 2 College College, City 3 Work Work, City, Friend 标记以逗号分隔 我需要知道这些标签的数量。我期待着 School

这听起来可能有点愚蠢,但我在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

根据您有多少个标记,如果只有少数标记,您可以为每个标记生成一个整数变量,然后生成一组if语句,这将向具有标记名称的变量添加1。

连接表并聚合:

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
子句中使用的函数将起作用。如果有空格,则必须使用
replace()
将其删除。

请参阅。
结果:

使用,仅适用于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
;

是否有表标签?@forpas是的,我有一个表用于标签。我已更新了相关的详细信息。表
标签
中的列
active
要求更好的名称。当我第一次看到它时,我认为这个字段是用来指示标签是
活动的
还是
不活动的
。谢谢你的回答。让我检查一下空格部分,我会告诉你的。投票通过。标签之间没有空格,但谢谢你一直回答这个问题。它可以帮助别人。我只想了解一件事。如果标签名称不存在于文章中,但存在于标签字段中,那么会发生什么。我想显示在posts表中存在的标签的数量。谢谢您的回答。你认为这是一个好的做法吗?或者有没有更好的方法来处理这种情况。谢谢,我会读更多的。你的解决方案很有效。如果需要,我会提出新问题。谢谢你的回答。我需要在它掠过我的头时读它。:)如果有一个标记
'Working'
函数instr()也会将其计入标记
'Work'
中。是的,但是使用
在集合中查找()
也会有问题。比如:
选择find_in_set('City,Friend,Work','Work')
,返回
0
。因此,人们应该始终努力理解所使用功能的可用性。。。。在发布之前,请阅读关于在_集中查找_()的内容:第一个参数是要搜索的字符串,第二个参数是列表:
select find_in_set('Work','City,Friend,Work')好,问题是INSTR的参数是相反的,但是仍然
选择find_in_set('Work','City,Friend,Work')返回
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
;