在MySQL上使用逗号分隔字段计算流行标签

时间:2012-11-07 17:14:53

标签: mysql sql select

我的桌子上有逗号分隔字段,它存储标签:

avengers, heroes, marvel, 2012, hulk, captain america

我想获得最常用的标签。

如何在一个SELECT查询中执行此操作?

2 个答案:

答案 0 :(得分:1)

你不能 - 一方面,MySQL不提供拆分字符串的功能。您需要规范化数据以在纯SQL中实现此目的。

答案 1 :(得分:0)

五十年过去了。仍然,一种方法来做到这一点。你实际上可以提取个别"术语"来自MySQL中以逗号分隔的术语列表。它令人难以置信地讨厌,它需要知道任何行中出现的最大术语数。 SUBSTRING_INDEX()函数是它的关键。

我们假设你在一个领域从未超过五个任期。然后,此查询将获取您的所有条款,并从最常见到最少的顺序进行排序。

SELECT COUNT(*), term FROM(
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',1), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',2), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',3), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',4), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',5), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(Tags,','), ',',6), ',', -1)) term FROM Resources
) terms
WHERE LENGTH(term) > 0
GROUP BY term
ORDER BY COUNT(*) DESC

如果你的最大学期数超过五个,你可以在工会中加入更多的术语。

你应该正常化吗?是的,你应该正常化。您可以使用此类查询来创建表的规范化版本。是。