Mysql连接两个表,其中table1中的部分字符串在table2中

时间:2015-06-07 15:46:07

标签: mysql sql join

我目前正在开发一个员工数据库网站。以前我的客户使用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),'%')

这只返回ardiansyah, setiawan thea and rusdy而不是除jonathan之外的所有员工。请注意,我使用的是inner join而不是left join,因为我想要取消not in ms_absen表的使用者。

2 个答案:

答案 0 :(得分:1)

您无法在不进行映射的情况下将一件事物映射到另一件事物(或加入您的州)。

如果我是你,我会尝试将其中一张桌子映射到其他表格并提供良好的数据,然后应用类似你指定的内容

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_part1, name_part2, ..., name_partN的某个转换表,其中N是名称中的最大字数(可以手动完成此N)。然后你可以应用这个逻辑(this is the comment to MySQL documentation on string built-in functions):

// 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

因此,您将拥有一个表格,其中nameX的每一列X都在1...N范围内。

这是我现在建议你不用RDBMS的最佳方法)

答案 1 :(得分:0)

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

  1. 这将产生一个包含3列的表。我们假设结果表将被称为A.

    选择 ID, SUBSTRING_INDEX('name','',1)AS a, SUBSTRING_INDEX(SUBSTRING_INDEX('name','',2),'', - 1)AS b 来自ms_absen

  2. 这是伪(我没有测试过)代码,显示了这个想法。

    选择e.id_emp,e.name,a.id 从ms_employee作为e,A作为a 其中e.name如concat('%',left(a.part1,3),'%') 或e.name如concat('%',left(a.part2,3),'%')