我在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
当您遇到如此糟糕的数据格式时,您可以使用它做一些事情。数字表可以提供帮助,但这里有一个示例可以提取前3个项目:
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个标记。然后有聚合。