2009-05-19 8 views
1

J'ai la structure de tableau suivant (en MySQL):Comment marquer des doublons dans un groupe donné dans MySQL?

DocID, Code, IsDup, DopOf 

, où DocID est unique.

Les valeurs sont comme:

 
1,AAAA,nul,nul 
2,AAAA,nul,nul 
3,AAAA,nul,nul 
4,BBBB,nul,nul 
5,CCCC,nul,nul 
6,CCCC,nul,nul 

Ce que je veux est d'écrire une procédure qui peut mettre à jour la table et donner le résultat souhaité que:

 
1,AAAA,0,0 
2,AAAA,1,1 
3,AAAA,1,1 
4,BBBB,0,0 
5,CCCC,0,0 
6,CCCC,1,5 

IsDup indique si le Doc est en double ou pas sur la base de Code, et DupOf indique l'original DocId.

Quelqu'un peut-il m'aider? J'essaie de mettre en œuvre la logique, mais je suis coincé.

Votre aide serait grandement appréciée.

Merci.

Répondre

3
UPDATE table t 
JOIN (
     SELECT code, MIN(docId) AS firstdoc 
     FROM table 
     GROUP BY 
       code 
     ) q 
ON  t.code = q.code 
SET  t.isDup = NOT (t.docId = q.firstdoc), 
     t.dupOf = CASE WHEH t.docId = q.firstdoc THEN 0 ELSE q.firstDoc END 

Si votre table est MyISAM, vous devriez avoir un index sur (code, docId).

Si votre table est InnoDB et docId est PRIMARY KEY, vous devriez avoir un index sur (code).

+0

Merci Quassnoi ... Ur La réponse est vraiment utile. :-) –

+0

Typo 'WHEH' devrait se lire' WHEN'. La requête a bien fonctionné pour moi. Je préférais donc utiliser 'u.dup_of = CAS QUAND u.id = p.first_id ALORS NULL ELSE p.first_id END' dans mon cas. – codemagician

Questions connexes