2008-11-06 6 views
0

Nous avons fréquemment des utilisateurs qui créent plusieurs comptes, puis stockent les mêmes données d'activité de cours plusieurs fois. Une fois qu'ils se rendent compte de l'erreur, ils nous contactent pour fusionner les comptes en un seul qu'ils peuvent utiliser.Comment écrire une requête pour fusionner deux comptes et leurs journaux d'activité en un seul?

Je me suis battu à mort en essayant de comprendre comment écrire une requête en MySQL qui va fusionner leurs journaux d'activité dans un seul profil afin que je puisse ensuite supprimer les autres profils, mais je ne trouve toujours pas la requête qui fonctionnera.

Les tableaux ressemblent à ceci:

CREATE TABLE user_rtab (
    user_id int PRIMARY KEY, 
    username varchar, 
    last_name varchar, 
    first_name varchar 
); 

CREATE TABLE lessonstatus_rtab (
    lesson_id int, 
    user_id int, 
    accessdate timestamp, 
    score double, 
); 

Ce qui se passe est que l'utilisateur finit par prendre les mêmes enseignements et leçons aussi différentes en deux ou plusieurs comptes et ils veulent prendre tous leurs statuts de cours et les faire assigner sous un compte d'utilisateur. Quelqu'un peut-il fournir une requête qui accomplirait cela en se basant sur les champs nom et prénom de la table utilisateur pour déterminer tous les comptes utilisateurs et utiliser uniquement le champ utilisateur ou nom d'utilisateur pour migrer tous les états nécessaires vers un compte unique?

Répondre

1

Un de mes clients actuels est confronté à un problème similaire , sauf qu'ils ont des dizaines de tables qui doivent être fusionnées. C'est une raison d'utiliser une clé primaire de la vie réelle (clé naturelle). Votre meilleur pari est d'essayer d'éviter ce problème avant même qu'il ne se produise.

Une autre chose à garder à l'esprit est que deux personnes peuvent partager les mêmes prénom et nom. Peut-être que vous ne considérez pas cela comme un problème à cause de votre base d'utilisateurs, mais s'ils créent déjà plusieurs comptes, combien de temps est-ce qu'ils commencent à créer de faux noms ou à créer des noms presque identiques? Les noms ne sont généralement pas une bonne chose pour déterminer si deux personnes sont identiques ou non. En ce qui concerne la partie technique de votre question, cela dépend beaucoup de ce que sont les règles métier. S'ils ont la même leçon deux fois avec des scores différents, utilisez-vous le meilleur score? Comment décidez-vous à quel compte d'utilisateur pour tout lier? Peu importe quoi, il s'agira probablement d'un processus en plusieurs étapes.

1

Que diriez-vous cela, en supposant que nous fusionnons user_id 2 en 1.

Cette met à jour les leçons faites sous 2 qui n'ont pas été fait sous 1.

UPDATE lessonstatus_rtab 
SET user_id = 1 
WHERE user_id = 2 
AND NOT EXISTS 
(SELECT * 
FROM lessonstatus_rtab e 
WHERE e.lesson_id = lessonstatus_rtab.lesson_id 
AND user_id = 1) 

Tout est les restes d'un double et peut maintenant eNLEVÉS:

DELETE FROM lessonstatus_rtab 
WHERE user_id = 2 
3

tentative de fusionner ces données via dernière/première est une idée horrible, plus les utilisateurs que vous avez, plus vous êtes susceptible de maillage des entrées incorrectes. Vous avez des ID sur vos tables pour une raison, utilisez-les.

Je ne vois aucune raison pour laquelle vous ne pouvez pas dire: « Je veux fusionner utilisateur 7 en 12 », puis procédez comme suit:

UPDATE lessonstatus_rtab SET user_id=12 WHERE user_id=7; 
DELETE FROM user_rtab WHERE user_id=7; 
Questions connexes