mySQL>>在逗号分隔的字段中查找最常用的单词

时间:2017-11-06 19:19:17

标签: mysql group-by tags normalize delimited-text

我的每个记录都有一个关键字字段,名为" RES_Tags"。该表是"资源"。

" RES_Tags"字段包含该记录的逗号分隔的关键字列表。

EX:

labor, work, unions, organized labor, strike, picket, boycott

我可以使用哪种SQL查询来查找最常用的30个标签?

我看到了这个相关的帖子Count popular tags with comma delimited field on MySQL,但我希望有人找到了一个方法,因为最初问这个问题。

或者,这个问题没有重复的原因,如果不可能使用SQL查询来做我要求的,唯一的方法是规范化,那么最好的方法是什么将现有的逗号分隔列表转换为Tags表和Tags-to-Resources表?

1 个答案:

答案 0 :(得分:2)

您实际上可以从MySQL中以逗号分隔的术语列表中提取单个“术语”。这是非常令人讨厌的,它要求知道任何行中出现的最大术语数。 SUBSTRING_INDEX()功能是它的关键。

假设你在一个领域从未超过五个任期。然后,此查询将获取您的所有条款。

SELECT term FROM(
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(RES_Tags,','), ',',1), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(RES_Tags,','), ',',2), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(RES_Tags,','), ',',3), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(RES_Tags,','), ',',4), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(RES_Tags,','), ',',5), ',', -1)) term FROM Resources
UNION ALL
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(RES_Tags,','), ',',6), ',', -1)) term FROM Resources
) terms
WHERE LENGTH(term) > 0

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

修改你应该正常化吗?是的,你应该正常化。您可以使用此类查询来创建表的规范化版本。是。这里有一些关于如何使用的提示。

计算出你现在拥有的最长记录中有多少个标签。加两个。编写此类查询以支持该数字。将其用作CREATE TABLE tags AS SELECT...查询的一部分。别回头看。