在MySQL中对类似的字段数据进行分组

时间:2018-03-01 11:40:33

标签: mysql

在MySQL中,我有一个表,它接受来自多个输入通道的公共数据,包含~100,000行。

其中一个字段,存储员工职能经理的姓名。在组织中,有大约100名这些职能经理。

我遇到的问题是,由于有多个输入渠道,不同的报告系统为这些经理使用了不同的名称格式。

例如,John Smith可以存储为;

John Smith
Smith, John
Smith John

现在这是一个噩梦,因为我们希望将此功能管理器字段用作报告机制,这意味着我们需要对各个职能经理进行排序或分组。

每个季度之后数据都会成为遗产,因此我们很乐意清理和格式化功能管理器字段。

问题是,是否有一种简单的方法可以对这些管理器进行分组,即使它们的名称格式不同,我也在寻找一种不会让我逐个通过每个功能管理器的方式这样:

UPDATE tablename SET fm_name = "John Smith" where fm_name like "%John%" and fm_name like "Smith"; 

例如;以编程方式,我可以获取第一条记录,将名称分解为其名字和姓氏字符串,然后匹配类似的记录并更新它们。然后转到下一条记录。在MySQL中是这样的,或者我会在上面的层中做得更好。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果你能提出一个标准化函数name_normalize(string),在给出确切输入或George H. W. Bush的情况下产生Bush, George H. W.,那么你可以做

  GROUP BY name_normalize(name)

并获得您想要的内容,而不会遗漏表格中的数据。

这是一个功能。它破解了MySQL的字符串函数。 https://dev.mysql.com/doc/refman/5.7/en/string-functions.html

IF(LOCATE(',',@name1) = 0,                               --need to change?
   @name1,                                               -- no, return original
   LEFT(CONCAT_WS(' ',                                   -- yes, concatenate...
                  TRIM(SUBSTRING_INDEX(@name1, ',',-1)), --  after last ,
                  @name1),                               --  whole name
        LENGTH(                                         -- cut to original name length
                REPLACE(@name1,',',''))))               -- but without the comma

替换@name列的名称。请注意,这对逗号后面的空格数很敏感。

将此功能定义为存储功能是明智的。首先,你可以更好地处理奇怪的情况。另一方面,在查询中编写它有点长。