пропустить первую повторяющуюся запись и обновить другие - PullRequest
0 голосов
/ 11 июня 2018

Запрос 1: проверьте, существуют ли дублирующиеся записи:

SELECT
    id , username, COUNT(*)
FROM
   tbluser
GROUP BY
   username
HAVING 
    COUNT(*) > 1;

Результат:

duplicate records

Запрос 2: Мониторинг дублирующихся записейпротив одного набора данных.

select * from tbluser where username = 'abcuser1';

Результат:

duplicate record

Запрос 3: (на основе данных в запросе 2, пропустить первую запись, т. Е. 293 иобновить статус для всех других повторяющихся вхождений.

Мой текущий подход к пропуску первой дублирующейся записи и обновлению других:

    SELECT CONCAT(id , ',') 
FROM    tbluser u1
WHERE   EXISTS
        (
        SELECT  1
        FROM    tbluser u2
        WHERE   u1.username = u2.username and u1.status = u2.status = 1 and u1.appId = u2.appId 
        LIMIT 1, 1
        )
        limit 1, 18446744073709551615

Выше запроса дают мне идентификаторы дубликатов записейчей статус должен быть обновлен. И затем я вставляю вышеупомянутые идентификаторы результата в:

update tbluser set status = 0 where id in (1,2);

Запрос 3 не дает желаемого результата: он просто пропускает первую запись и дает все другие дубликаты записей всех наборов данных.

Как пропустить первую дублирующую запись из каждого набора данных?

1 Ответ

0 голосов
/ 11 июня 2018

Это один из способов:

UPDATE tbluser t
JOIN (
   SELECT username, MIN(id) AS min_id
   FROM tbluser
   GROUP BY username
) AS g ON t.username = g.username AND t.id <> min_id
SET status = 0;

Приведенный выше запрос обновляет все записи, имеющие значение id, превышающее минимальное значение id в пределах среза username.

Демо здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...