【问题标题】:MySQL: count comma separated values from fieldMySQL:从字段中计算逗号分隔的值
【发布时间】:2020-06-21 08:23:30
【问题描述】:

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

【问题讨论】:

  • 有表标签吗?​​
  • @forpas 是的,我有一个标签表。我已经更新了相关的详细信息。
  • active 表中的列tags 需要一个更好的名称。第一次看它时,我认为该字段用于指示标签是active 还是not active

标签: mysql


【解决方案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 子句中使用的函数find_in_set() 将起作用。如果有空格,则必须使用replace() 删除它们。

请参阅demo
结果:

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

【讨论】:

  • 感谢您的回答。让我检查一下空间部分,然后告诉你。投票赞成。
  • 标签之间没有空格,但感谢您回答。它可以帮助别人。只想明白一件事。如果标签名称不存在于帖子中但存在于标签字段中,那么会发生什么。
  • 我想显示帖子表中存在的标签数。
  • 感谢您的回答。你认为这是一个好习惯吗?或者有没有更好的方法来处理这种情况。
  • 谢谢,我会阅读更多相关信息。您的解决方案运行良好。如果需要,我会提出新问题。
【解决方案2】:

使用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
;

【讨论】:

  • 感谢您的回答。我需要阅读它,因为它越过我的脑海。 :)
  • 如果有标签'Working',函数instr()也会将它计入标签'Work'
  • 是的,但是使用FIND_IN_SET() 你也有问题。比如:select find_in_set('City, Friend, Work','Work');,它返回0。因此,应该始终尝试了解所使用功能的可用性....?
  • 在发帖前阅读 find_in_set():第一个参数是要搜索的字符串,第二个是列表:select find_in_set('Work', 'City, Friend, Work');
  • 好的,问题是 INSTR 的参数是相反的,但 select find_in_set('Work','City, Friend, Work'); 仍然返回 0
【解决方案3】:

根据你有多少个标签,如果你只有几个,你可以为每个标签创建一个整数变量,然后创建一堆 if 语句,这会将 1 添加到具有标签的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多