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

mySQL >> Finding the most frequently used words in a comma-delimited field

我的每条记录都有一个名为 "RES_Tags" 的关键字字段。 table 是 "Resources".

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

例如:

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

我可以使用什么 SQL 查询来找出 30 个最常用的标签?

我看到了这个相关的线程 Count popular tags with comma delimited field on MySQL,但我希望自从最初提出这个问题后有人找到了解决方法。

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

的最佳方法

您实际上可以从 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

如果您的最大任期数超过五个,您可以在联合中加入更多的任期。

编辑 你应该标准化吗?是的,你应该正常化。您可以使用这种查询来创建 table 的规范化版本吗?是的。这里有一些提示。

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