如何从“标签”列中检索单个标签?

时间:2018-09-01 19:47:41

标签: mysql sql

我在MySQL数据库中有下表:

id    creation_date                         score     tags
1     2016-02-09 07:24:59.097000+00:00      -1        html|javascript
2     2016-02-09 08:10:00.000000+00:00      0         xml|css
3     2016-02-10 08:00:15.000000+00:00      2         html|javascript
4     2016-02-11 07:00:45.000000+00:00      -5        html|css

我想检索标签并按分数排序。然后,我想按负面得分的频率对标签进行排序,以使最差的标签出现在顶部。

上述查询的预期结果将是:

TAG          FREQUENCY
html         2
css          1
javascript   1
xml          0

我陷入了从列中检索单个标签的困境。

SELECT tags, COUNT(*) 
FROM my_table 
WHERE score < 0

1 个答案:

答案 0 :(得分:1)

当您使用如此糟糕的数据格式时,可以使用它做一些事情。数字表可以提供帮助,但是下面的示例最多可以提取前三项:

select substring_index(substring_index(tags, '|', n.n), '|', -1) as tag, count(*)
from (select 1 as n union all
      select 2 as n union all
      select 3 as n
     ) n join
     t
     on n.n <= length(tags) - length(replace(t.tags, '|', '')) + 1
group by tag;

这是做什么的?对于给定的值onn子句确保字符串中至少有n个标记(较大的值被滤除)。

两个substring_index()函数正在从列表中提取第n个标签。然后是聚合。