2009-10-16 6 views
-1

J'ai la base de données mySQL avec quelques entrées en double. Ils ont le même champ - téléphone. Mais ils avaient aussi des champs qui diffèrent. A l'exemple j'ai deux entrées avec le même téléphone, mais la première entrée a la notation classée = default_value et la deuxième entrée a le champ de notation = 5. Ainsi je dois fusionner ces entrées et ensuite seulement les doublons ...Fusionner, puis supprimer les entrées en double

Plus d'exemple commun:

entry1.phone==123 
entry1.phone==etry2.phone 
    entry1.rating!=entry2.phone 
    entry1.rating==default_value(0) 
    entry2.rating==5 
    merge 
    entry1.phone==123 
    entry1.rating==5 
    entry2 is deleted 
+0

Qu'est-ce que demandez-vous? –

+0

je demande comment faire ceci ... requête sql ou routine stockée ... – Oleksandr

+2

Mais comment détermineriez-vous quel enregistrement vous supprimerez? (Sauf si ce sont des doublons exacts, mais la façon dont vous demandez suggère qu'ils ne le sont pas ...) –

Répondre

1

Il semble que vous n'avez pas vraiment besoin de fusionner des enregistrements si vous essayez simplement de mettre à jour le premier enregistrement avec la notation non-par défaut. Je pense que vous pouvez simplement supprimer tous les enregistrements avec l'évaluation par défaut.

Select a.* 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating < b.Rating 


Delete a 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating < b.Rating 

Si vous avez vraiment de mettre à jour le premier enregistrement et supprimer le second enregistrement, vous pouvez faire quelque chose de similaire si vous avez une carte d'identité autoincrement. L'exemple suivant est ce que je ferais pour mettre à jour le premier enregistrement si un ID existe. Ceci est seulement fiable si vous avez seulement des numéros de téléphone dupliqués une fois.

Update a 
Set a.Rating = b.Rating 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating < b.Rating 
    and a.ID < b.ID 


Delete a 
from tbl a 
inner join tbl b 
on a.Phone = b.Phone 
    and a.Rating = b.Rating 
    and b.ID > a.ID 

Espérons que cela aide.

-Ranthalion

2

Je ne pense pas que vous puissiez le faire efficacement en SQL. Une façon lente de le faire est quelque chose comme:

Une meilleure façon serait une procédure stockée ou un script externe. Sélectionnez toutes les lignes de la table commandées par phone et effectuez le regroupement/fusion/suppression manuellement (passez en revue les résultats, comparez à la valeur phone de la ligne précédente, si vous avez un nouveau groupe, etc.). Ecrire des procédures stockées dans MySQL est douloureux, donc je ne vais pas écrire le code pour vous. :)

Questions connexes