我正在与社区中的尼泊尔难民做一些志愿工作,我正在设法组织他们的住址。我在一个表中有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列同时具有姓和名,所以我一直很难做到这一点。
答案 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, ',');
如前面的注释中所述,给定的姓氏本身可能不是唯一的。假设名称表中也包含名字,我们可以修改上面的查询以检查名字:
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, '$');
但是,即使这样可能仍然会出现问题,因为有时人们的名字或姓氏由两个(或多个)单词组成。另外,也可以使用中间名。
为获得更好的解决方案,您可能需要先将名字,中间名和姓氏分解为单独的列,然后再将数据导入数据库。