mySQL найти похожие, но не идентичные записи

Все, я обнаружил, что мои пользователи вводили имена клиентов все неправильно. Ниже приведен пример того, как они вводят имена клиентов. Я думаю, они думали, что им нужна учетная запись для каждого места жительства этого парня. У меня тоже есть похожие записи, но фальшивый средний инициал перед фамилией. Если бы я хотел получить список клиентов, которые делятся именами и электронными письмами, как бы я это сделал? Я уже использовал запрос, который я включу под моими данными примера, но это отсутствующие результаты, как в моих данных примера. Вместо этого он возвращает другие дубликаты, которые я хочу вернуть, просто не такие записи, как 1,2 ниже.

Образец:

ID | first Name | last Name | email          | Residence     |
---+------------+-----------+----------------+---------------+
1  | Bill A     | Bob       | bill@bob.com   | 1-2 broad st  |
2  | Bill B     | Bob       | bill@bob.com   | 1-3 broad st  |
3  | Fred       | Jones     | f.jones@me.com | 1 example st  |
4  | Fred       | Jones     | f.jones@me.com | 200 South ave |
5  | Alex       | Man       | Manley@grt.com | 25 N Main st  |
6  | Alex       | Man       | Manley@grt.com | 39 Front st   |

Запрос:

SELECT C.ID, R.Customer_ID , C.orgName, C.fName, C.lName, C.email, R.hNumber, R.street, R.aNumber, R.city
FROM Customer C
LEFT JOIN Residence R ON C.ID = R.Customer_ID
JOIN (
    SELECT X.fName, X.lName
    FROM Customer X 
    GROUP BY X.fName, X.lName 
    HAVING COUNT(*) > 1
) X ON X.fName = C.fName AND X.lName = C.lName
ORDER BY C.fName, C.lName

2 ответа

  1. Я не думаю, что нет… каждый способ, вероятно, будет включать в себя ручное определение шаблона, который был использован, и изменение его, как с помощью большой инструкции case… что не является » автоматическим»

    Ближе всего было бы использовать soundex, чтобы сказать, звучат ли они одинаково… http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_soundex

    Если вы можете использовать другой язык программирования, то я бы рекомендовал что-то вроде… http://php.net/manual/en/function.similar-text.php но он будет комутационно тяжелым

  2. Вы можете использовать (по крайней мере, для mysql)

    SELECT C.ID, R.Customer_ID , C.orgName, C.fName, C.lName, C.email,
           R.hNumber, R.street, R.aNumber, R.city
    FROM Customer C
    LEFT JOIN Residence R ON C.ID = R.Customer_ID
    JOIN Customer C1 on C.ID <> C1.id
    LEFT JOIN Residence R1 ON C1.ID = R1.Customer_ID
    where 
          C1.fName = C.fName AND C1.lName = C.lName
       or C1.email = C.email
       or <whatever else you like to compare, eg. same adress + same lastname>
    group by C.ID
    

    или, более общее,

    SELECT C.ID, R.Customer_ID , C.orgName, C.fName, C.lName, C.email,
           R.hNumber, R.street, R.aNumber, R.city
    FROM Customer C
    LEFT JOIN Residence R ON C.ID = R.Customer_ID
    where exists (
       select * from 
       Customer C1 
       LEFT JOIN Residence R1 ON C1.ID = R1.Customer_ID
       where 
          C.ID <> C1.id          
          and (
                C1.fName = C.fName AND C1.lName = C.lName
                or C1.email = C.email
                or <whatever else you like to compare, eg. same adress + same lastname>
              )
     )  
    

    Конечно, это даст вам только ограниченную проверку дубликатов, особенно если кто-то намеренно пытается обойти это (например, в shopsystem, но есть инструменты и процедуры, которые помогут вам в этом).