Удаление повторяющихся строк в MySQL путем слияния информации

92
11

У меня большой стол с информацией о человеке. Каждая запись имеет идентификатор и ссылается на другие таблицы. Я заметил, что у многих записей есть дубликаты ключей, но они различаются по количеству информации в других полях. Я хотел бы объединить информацию в разных полях в одну и сделать, что запись "master" и все ссылки на другие записи должны быть заменены основной записью.

Пример

| id | key1 | key2 | name | city | dob      |
|--- | ---- | ---- | ---- | ---- | -------- |
| 1 | 1 | 2 | John | | |
| 2 | 1 | 2 | | Town | |
| 3 | 1 | 2 | John | | 70/09/12 |

Мне нужно записать одну запись (id - либо 1, 2 или 3) со значениями key1 = 1, key2 = 2, name = John, city = Town, dob = 70/09/12.

Есть ли разумный способ объединить эти записи без тестирования для каждого поля (в моей фактической таблице много полей)?

спросил(а) 2017-09-28T19:34:00+03:00 3 года, 1 месяц назад
1
Решение
100

Вы можете использовать MAX() для получения непустых значений для каждого ключа.

SELECT key1, key2, MAX(id) AS id, MAX(name) AS name, MAX(city) AS city, MAX(dob) AS dob
FROM yourTable
GROUP BY key1, key2

Если между строками могут быть разные значения, и вы не хотите их включать, вы можете добавить:

HAVING COUNT(DISTINCT NULLIF(name, ''), NULLIF(city, ''), NULLIF(dob, '')) = 1

ответил(а) 2017-09-28T19:40:00+03:00 3 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема