我在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
答案 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;
这是做什么的?对于给定的值on
,n
子句确保字符串中至少有n
个标记(较大的值被滤除)。
两个substring_index()
函数正在从列表中提取第n个标签。然后是聚合。