Сократите число пустых повторяющихся строк в MySQL со многих до одного

0

Мне нужен оператор update чтобы решить некоторые проблемы с дубликатами в таблице на MySQL. Структура таблицы показана ниже. Мне нужен оператор MySQL, который установит значение дубликата как NULL кроме первого, то есть с самым низким идентификатором. Здесь идентификатор является первичным ключом.

Это пример того, что у меня есть:

 id       name
  1        foo
  2        foo
  3        bar
  4        NULL
  5        NULL
  6        foo
  7        bar

Это желаемый результат:

 id        name 
  1        foo
  2        NULL
  3        bar
  4        NULL
  5        NULL
  6        NULL
  7        NULL

В таблице есть другие столбцы с полезной информацией. Следовательно, строка не может быть просто удалена.

  • 0
    Вы используете MySQL или MS SQL Server?
  • 0
    MySQLServer не MS SQL
Показать ещё 1 комментарий
Теги:
database

3 ответа

1
Лучший ответ

Я бы написал это так:

UPDATE t JOIN
       (SELECT name, MIN(id) as min_id
        FROM t
        GROUP BY name
       ) tt
       ON t.name = tt.name and t.id > tt.min_id
    SET t.name = NULL;

Я думаю, что логика легче следовать с помощью JOIN. В основном, это говорит, чтобы найти минимальный идентификатор для каждого name. Затем установите все остальные строки с тем же name в NULL.

0
UPDATE t JOIN
   (SELECT name, MIN(id) as min_id
    FROM t
    WHERE name IS NOT NULL
    GROUP BY name
    HAVING COUNT(*) > 1
   ) tt
   ON t.name = tt.name and t.id > tt.min_id
SET t.name = NULL;
  • 2
    Пожалуйста, добавьте некоторые пояснения к вашему коду, чтобы ОП мог учиться у него
0

Ваш запрос UPDATE может включать в себя JOIN.

например, присоедините минимальный идентификатор для каждого имени и обновляйте только тогда, когда идентификатор не является минимальным.

UPDATE
    t
    LEFT OUTER JOIN (
        SELECT
            MIN(id) AS id
        FROM
            t
        GROUP BY
            name
    ) t1 ON t.id = t1.id
SET
    t.name = NULL
WHERE
    t1.id IS NULL

DB Fiddle

Ещё вопросы

Сообщество Overcoder
Наверх
Меню