我目前正在开发一个员工数据库网站。以前我的客户使用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
表的使用者。
答案 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)
鉴于我们在问题中提供了数据,我们可以这样写:
这将产生一个包含3列的表。我们假设结果表将被称为A.
选择 ID, SUBSTRING_INDEX('name','',1)AS a, SUBSTRING_INDEX(SUBSTRING_INDEX('name','',2),'', - 1)AS b 来自ms_absen
这是伪(我没有测试过)代码,显示了这个想法。
选择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),'%')