Как пометить дубликаты в данной группе в MySQL?

У меня есть следующая структура таблицы (в MySQL):

DocID, Code, IsDup, DopOf

, где DocID — уникальный.

Ценности такие:

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

Я хочу написать процедуру, которая может обновлять таблицу и давать желаемый результат:

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 показывает, является ли Doc дубликатом или нет на основе Code, а DupOf указывает на исходный DocId.

Кто-нибудь может мне помочь? Я пытаюсь реализовать логику, но я застрял.

Ваша помощь будет высоко оценена.

Спасибо.


person Ashok Gupta    schedule 19.05.2009    source источник


Ответы (1)


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

Если ваша таблица MyISAM, у вас должен быть индекс (code, docId).

Если ваша таблица InnoDB, а docId — это PRIMARY KEY, у вас должен быть индекс для (code).

person Quassnoi    schedule 19.05.2009
comment
Спасибо Quassnoi ... Ваш ответ действительно очень полезен. :-) - person Ashok Gupta; 20.05.2009
comment
Опечатка WHEH должна читаться WHEN. Запрос работал отлично для меня. Я предпочел использовать u.dup_of = CASE WHEN u.id = p.first_id THEN NULL ELSE p.first_id END в моем случае. - person Andy Fusniak; 08.03.2017