代码之家  ›  专栏  ›  技术社区  ›  nbardach

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

  •  0
  • nbardach  · 技术社区  · 7 年前

    我的每个记录都有一个关键字字段,称为“RES_Tags”。表格是“资源”。

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

    前任:

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

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

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

    或者,这个问题不是重复的原因,如果不可能使用SQL查询来完成我所要求的任务,并且唯一的方法是规范化,那么将现有的逗号分隔列表转换为标记表和标记到资源表的最佳方法是什么?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Community CDub    4 年前

    要求 知道将出现在任何行中的最大项数。这个 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... 查询不要回头看。