Mysql连接两个表,其中表1中字符串的一部分在表2中

Mysql连接两个表,其中表1中字符串的一部分在表2中,mysql,sql,join,Mysql,Sql,Join,我目前正在开发一个员工数据库网站。以前我的客户使用ms.excel作为数据库存储,没有结构。但是他们已经有了成千上万的数据。我已经将数据导入到临时表中。问题是,我不得不调整数据库结构的excel数据 这是我的表格结构: ms_absen : id name ------------------------ 11 vnice ardian 22 setiawan ecco 33 andytaman1 44 rusdytaman2 ms_empl

我目前正在开发一个员工数据库网站。以前我的客户使用ms.excel作为数据库存储,没有结构。但是他们已经有了成千上万的数据。我已经将数据导入到临时表中。问题是,我不得不调整数据库结构的excel数据

这是我的表格结构:

ms_absen :

id      name
------------------------
11      vnice ardian
22      setiawan ecco
33      andytaman1
44      rusdytaman2

ms_employee :

id_emp    name          
---------------------------
01        ardiansyah       
02        setiawan thea    
03        arif andy syah   
04        jonathan         
05        f rusdy          

expected result :

id_emp    name               id
--------------------------------------
01        ardiansyah         11
02        setiawan thea      22
03        arif andy syah     33
05        rusdy              44
这就是我到目前为止所尝试的

select e.id_emp,e.name,a.id
from ms_employee as e
inner join ms_absen a
on a.name like concat('%',left(e.name,3),'%')

此报税表仅适用于阿登斯耶、塞蒂亚万·西娅和罗斯迪,不适用于除乔纳森以外的所有员工。请注意,我使用的是
内部联接
而不是
左联接
,因为我想消除
不在ms_absen
表中的员工。

如果没有映射,就无法将一件事映射到另一件事(或在您的状态下加入)

如果我是您,我会尝试将其中一个表映射到另一个具有良好数据的表,然后应用您指定的内容

select e.id_emp,e.name,a.id
from ms_employee as e
inner join ms_absen a
on a.name like concat('%',left(e.name,3),'%')
问题是-如何将您的数据转换为良好的数据

你看,这个名称列中有一个空格。如果你没有空间,那就容易多了。因此,您可以将一个表映射到具有列
id,name\u part1,name\u part2,…,name\u partN
,其中
N
是名称中的最大字数(可以手动查找此
N
)。然后您可以应用与此类似的逻辑():

因此,您将有一个表,其中每个列
nameX
where
X
都在范围
1…N


这是目前我能为您提供的最好的建议,无需使用RDBMS)

鉴于问题中提供的数据,我们可以这样写:

  • 这将生成一个包含3列的表。让我们假设生成的表将被称为A

    挑选 身份证件 子字符串_索引('name','',1)作为, 子字符串索引(子字符串索引('name','',2),''.-1)为b 来自阿贝森女士

  • 这是一段伪代码(我还没有测试过),它展示了这个想法

    选择e.id\u emp、e.name、a.id 来自作为e的ms_员工,作为A 其中e.name如concat(“%”,左(a.part1,3),“%”) 或者像concat(“%”,左(a.part2,3),“%”这样的e.name


  • 您必须手动修复名称。在Excel中,为员工id添加另一列并开始输入。从我所看到的,字符串只是为了找出任何规则而不同而已。@GordonLinoff除了在excel上手动修复名称之外,你没有其他技巧吗?Excel数据有数千行,我真的没有。您可以下载Levenshtein distance的函数(谷歌:“mysql Levenshtein”)。这可能会很好地找到最接近的匹配项。“arif andy syah”和“andytaman1”有什么关系?您的客户确实需要修复数据。@GordonLinoff谢谢您的建议,我将尝试mysql levenshtein来解决此问题。但是我需要保持这个问题的开放性,任何建议都是非常受欢迎的。是否有,如果有,那么映射名称的模式是什么?因为您的条件
    concat('%',left(e.name,3),'%')
    显然不是通用的,例如
    f rusdy
    将导致在第一个表中搜索
    f r
    。很抱歉,延迟答复。你能告诉我如何在我的问题上实现这一点吗?谢谢你的回答。让我试试看,我会回来给你一些反馈。我实际上没有试过,但我从你的回答中得到了解决我问题的线索。非常感谢。
    // Posted by [name withheld] on March 22 2006 8:02pm
    
    // This will split an IP address ("a.b.c.d") into 4 respective octets:
    
    SELECT
    `ip` ,
    SUBSTRING_INDEX( `ip` , '.', 1 ) AS a,
    SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', 2 ),'.',-1) AS b,
    SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', -2 ),'.',1) AS c,
    SUBSTRING_INDEX( `ip` , '.', -1 ) AS d
    FROM log_table