MySQL объединяет две таблицы только с частичным совпадением - PullRequest
0 голосов
/ 17 января 2019

Я занимаюсь волонтерской работой с непальскими беженцами в моей общине и пытаюсь организовать их адреса. У меня 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

Я хочу, чтобы адреса были только для людей с непальскими фамилиями, поэтому я хочу выбрать все столбцы из моей таблицы адресов, которые совпадают с фамилиями из моей таблицы имен, путем объединения таблиц из столбца Last_Name в таблице имен с именем владельца-имени столбец в AddressTable. Поскольку столбец Owner_Name имеет как фамилию, так и имя, у меня возникли проблемы с этим.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Прежде чем я отвечу, позвольте мне сказать, что это не сработает по всей вероятности. Подобное сопоставление имен чревато проблемами, если только вы не знаете, что данные канонически структурированы.

Вы можете сделать это несколькими способами. Идея в том, что вам нужны функции в предложении on. Например:

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

Предполагается, что фамилия находится в owner_name перед первой запятой.

0 голосов
/ 17 января 2019

Я рекомендую использовать 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, '$');

Но даже это может все еще иметь проблемы, потому что иногда люди имеют имя или фамилию, состоящую издва (или более) слова.Также возможна такая вещь, как отчество.

Для лучшего решения вы можете разбить имя, отчество и фамилию на отдельные столбцы, прежде чем переносить данные в базу данных.

...