这听起来可能有点愚蠢,但我在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
连接表并聚合:
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。