MySQL仅部分匹配而联接两个表

时间:2019-01-17 16:14:09

标签: mysql sql join jointable

我正在与社区中的尼泊尔难民做一些志愿工作,我正在设法组织他们的住址。我在一个表中有656个尼泊尔姓,在另一个表中有约608,000个地址。我以前从未使用过MySQL,并且仅在线学习了一些有关制作这些表的信息。 不是表中的真实姓名。 我的桌子:

AddressTable: 4 Columns

Owner_Name      Owner_Address   Owner_CityState   Owner_Zip
------------------------------------------------------
Smith, John   | ************* | *************** | *****
adhikari, Prem| ************* | *************** | *****
Baker, Mary   | ************* | *************** | *****

NamesTable: 1 Column

Last_Name
-----------
Smith
adhikari
Baker

我只想要有尼泊尔姓氏的人的地址,所以我想通过将NamesTable中Last_Name列中的表与Owner_Name连接起来,来选择AddressTable中与NamesTable中姓氏匹配的所有列地址表中的列。由于Owner_Name列同时具有姓和名,所以我一直很难做到这一点。

2 个答案:

答案 0 :(得分:1)

在我回答之前,我只想说这不可能。除非您知道数据的规范结构,否则这样的名称匹配会遇到很多问题。

您可以通过多种方式执行此操作。这个想法是您需要on子句中的函数。例如:

select . . . 
from addresstable a join
     namestable n
     on n.last_name = substring_index(owner_name, ',', 1);

这假定姓氏在第一个逗号之前的owner_name中。

答案 1 :(得分:0)

我建议在此处使用REGEXP

SELECT at.*
FROM AddressTable at
INNER JOIN NamesTable nt
    ON at.Owner_Name REGEXP CONCAT('^', nt.Last_Name, ',');

Demo

如前面的注释中所述,给定的姓氏本身可能不是唯一的。假设名称表中也包含名字,我们可以修改上面的查询以检查名字:

SELECT at.*
FROM AddressTable at
INNER JOIN NamesTable nt
    ON at.Owner_Name REGEXP CONCAT('^', nt.Last_Name, ',') AND
       at.Owner_Name REGEXP CONCAT(' ', nt.First_Name, '$');

但是,即使这样可能仍然会出现问题,因为有时人们的名字或姓氏由两个(或多个)单词组成。另外,也可以使用中间名。

为获得更好的解决方案,您可能需要先将名字,中间名和姓氏分解为单独的列,然后再将数据导入数据库。