2011-12-06 4 views
3

J'ai un problème que je n'arrive pas à trouver la réponse. J'ai développé une très petite application de type CRM en PHP dirigée par MySQL. Les utilisateurs de cette application peuvent importer de nouvelles données dans la base de données via un fichier CSV téléchargé. L'un des problèmes que nous tentons de résoudre en ce moment est la duplication, ou, plus important encore, la proximité d'enregistrements en double. Par exemple, si je donne les résultats suivants:MySQL supprimer/combiner des lignes similaires

Record A: [1, Bob, Jones, Atlanta, GA, 30327, (404) 555-1234] 

et

Record B: [2, Bobby, Jones, Atlanta, GA, 30327, Bob's Shoe Store, (404) 555-1234] 

je besoin d'un moyen de voir que ceux-ci sont à la fois similaires, prenez le record avec plus d'informations (dans ce cas, dossier B) et supprimer l'enregistrement A.

Mais ici, c'est encore plus compliqué. Cela doit être fait lors de l'importation de nouvelles données, et une fonction que je peux exécuter pour supprimer les doublons de la base de données à tout moment. J'ai été capable de mettre quelque chose en PHP qui récupère toutes les lignes dupliquées de la table MySQL et les associe par numéro de téléphone, ou en utilisant implode() sur toutes les colonnes de la ligne puis en utilisant strlen() pour décider de l'enregistrement le plus long . Il doit y avoir une meilleure façon de faire, et une plus précise.

Est-ce que l'un d'entre vous a des suggestions brillantes que je pourrais être en mesure d'implémenter ou de développer? Il est évident que lors de l'importation de nouvelles données, je dois ouvrir leur fichier CSV dans un tableau ou une table MySQL temporaire, faire la recherche en double/similaire, puis recompiler le fichier CSV ou ajouter tout de la table temporaire à la table principale. Je pense. :)

J'espère que certains d'entre vous pourront signaler quelque chose qui me manquera peut-être évoluer assez décemment et c'est assez précis. Je préfère présenter une liste de doublons dont nous ne sommes pas sûrs à propos d'un utilisateur qui a 5 enregistrements de long, pas de 5 000.

Merci d'avance! Alex

Répondre

0

Je ne pense pas qu'il existe des solutions brillantes. Vous devez déterminer la priorité de vos champs de données sur lesquels vous pouvez compter pour détecter la similarité, par exemple le téléphone, certains types d'ID, une adresse uniforme ou un nom officiel. Vous pouvez enregistrer des valeurs nettoyées (réduites au même format que les chiffres uniquement dans les téléphones, l'adresse complète concaténée) avec la ligne que vous seriez en mesure d'utiliser pour la recherche de similarité lors de l'ajout d'enregistrements. Ensuite, vous devez décider de l'exhaustivité des données dans tous les cas pour mettre à jour les lignes existantes avec des champs plus complets, ou supprimer les anciens et ajouter une nouvelle ligne.

Je ne connais aucune solution prête pour une telle tâche variable et doute qu'ils existent.

2

Si j'étais vous je donnerais une clé UNIQUE à name, surname et phone number puisqu'en théorie si tous ces trois sont égaux alors cela signifie qu'il s'agit d'un doublon. Je pense parce qu'un numéro de téléphone ne peut avoir qu'un seul propriétaire. De toute façon, vous devriez trouver une combinaison de 2-3 ou peut-être 4 colonnes et leur attribuer une clé unique. Une fois que vous avez une telle structure, exécutez quelque chose comme ceci:

// assuming that you have defined something like the following in your CREATE TABLE: 
UNIQUE(phone, name, surname) 
// then you should perform something like: 
INSERT INTO your_table (phone, name, surname) VALUES ($val1, $val2, $val3) 
ON DUPLICATE KEY UPDATE phone = IFNULL($val1, phone), 
         name = IFNULL($val2, name), 
         surname = IFNULL($val3, surname); 

Donc, fondamentalement, si la valeur insérée est un doublon, ce code mettra à jour la ligne, plutôt que d'insérer un nouveau. La fonction IFNULL effectue une vérification pour voir si la première expression est nulle ou non. Si elle est nulle, alors elle choisit la deuxième expression, qui dans ce cas est la valeur de la colonne qui existe déjà dans votre table. Par conséquent, il mettra à jour votre ligne avec autant d'informations que possible.

Questions connexes