Mysql连接两个表,其中表1中字符串的一部分在表2中
我目前正在开发一个员工数据库网站。以前我的客户使用ms.excel作为数据库存储,没有结构。但是他们已经有了成千上万的数据。我已经将数据导入到临时表中。问题是,我不得不调整数据库结构的excel数据 这是我的表格结构: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_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
whereX
都在范围1…N
内
这是目前我能为您提供的最好的建议,无需使用RDBMS)鉴于问题中提供的数据,我们可以这样写:
您必须手动修复名称。在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