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