2010-02-12 7 views
4

Je voudrais trouver tous les enregistrements en double par nom dans une table client en utilisant MySQL, y compris ceux qui ne correspondent pas exactement.Trouver des enregistrements en double dans MySQL en utilisant LIKE

Je sais que je peux utiliser la requête

SELECT id, name FROM customer GROUP BY name HAVING count(*) > 1; 

pour trouver toutes les lignes qui correspondent exactement, mais je veux trouver toutes les lignes en double correspondant à une clause LIKE. Par exemple, il pourrait y avoir un client avec le nom "Mark's Widgets" et un autre "Mark's Widgets Inc." Je voudrais que ma requête les trouve en tant que doublons. Je sais que c'est complètement incorrect, mais c'est l'idée. Voici le schéma mesure:

mysql> describe customer; 
+-----------------------------+--------------+------+-----+------------+----------------+ 
| Field      | Type   | Null | Key | Default | Extra   | 
+-----------------------------+--------------+------+-----+------------+----------------+ 
| id       | int(11)  | NO | PRI | NULL  | auto_increment | 
| name      | varchar(140) | NO |  | NULL  |    | 
... 

EDIT: Pour clarifier les choses, je veux trouver tous les doublons, et pas seulement les doublons d'un nom de client spécifique.

Répondre

3

Il est tout à fait possible de le faire, mais avant même de commencer, vous devez définir vos règles concernant ce qui correspond et ce qui ne l'est pas, sans quoi vous ne pouvez aller nulle part. Vous pouvez, par exemple, ignorer le premier et le dernier 3 caractères du nom et faire correspondre les caractères du milieu, ou vous pouvez choisir une logique plus complexe, mais il n'y a pas de méthode magique pour atteindre ce que vous voulez, vous aurez coder la logique. Quel que soit votre choix, il doit être défini avant de commencer et avant que nous puissions vraiment beaucoup aider.

Pas mysql ici, donc excuser les erreurs de syntaxe (sa syntaxe t-sql le cas échéant), mais je pense une auto se joindre à

SELECT 
    t1.ID 
FROM MyTable t1 
LEFT OUTER JOIN MyTable t2 
ON t1.name LIKE CONCAT('%', t2.name, '%') 
group by t1.ID 
HAVING count(*) > 1 
+0

Je pense qu'un bon début est un nom étant une sous-chaîne d'un autre. Le type de correspondance que je cherchais était name1 LIKE% name2% – markb

+0

@markb, OK j'ai édité une solution possible. –

+1

Voici la syntaxe MySQL: SELECT t1.ID, t1.name FROM client t1 LEFT OUTER JOIN client t2 ON t1.name LIKE CONCAT ('%', t2.nom, '%') grouper par t1.ID COMPTE comptant (*)> 1; – markb

-1
SELECT * FROM customer WHERE name LIKE "%Mark's Widgets%"; 

http://www.mysqltutorial.org/sql-like-mysql.aspx devrait également aider avec la commande LIKE.

Vous ne savez pas exactement pourquoi vous devez utiliser la section CONCAT, cela peut donc être trop simple.

+0

Peut-être que je n'étais pas assez clair. Je veux trouver tous les doublons, pas seulement les doublons d'un nom de client spécifique. Pour le même effet que la première requête de l'exemple, mais en utilisant LIKE. – markb

0

Je pense que cela va fonctionner, mais dans mon expérience, ayant des fonctions à l'intérieur ONs prend un temps ridicule à traiter, en particulier en combinaison avec l'opérateur LIKE. Pourtant, c'est légèrement mieux qu'une jointure croisée.

SELECT 
cust1.id, 
cust1.name 
FROM 
customer AS cust1 
INNER JOIN customer AS cust2 ON 
(cust1.name LIKE (CONCAT('%',CONCAT(cust2.name,'%')))) 
GROUP BY 
cust1.id, 
cust1.name 
HAVING 
count(*) > 1 
0

Et à ce sujet. Vous pouvez substituer le a.name = b.name avec votre like si cela fait une différence.

Select a.id, b.id from customer a, customer b where a.name = b.name and a.id != b.id; 
0

Ma réponse serait ...

SELECT A . * 
FROM customer AS A, customer AS B 
WHERE A.name LIKE CONCAT('%', B.name, '%') 
AND A.name = B.name 
GROUP BY A.id 
HAVING COUNT(*) >1 
Questions connexes