Если мы INNER JOIN
стол с самим собой, как
SELECT t1.id id1,
t2.id id2
FROM elbat t1
INNER JOIN elbat t2
ON t2.product = t1.product
AND (t2.name = t1.name
OR t2.email = t1.email
OR t2.phone = t1.phone)
AND t2.id > t1.id;
у нас будет самый низкий идентификатор "группы" с более чем одной строкой в id1
. Для каждого id1
остальные члены «группы» находятся в id2
.
То есть мы можем объединить результат из вышеприведенного запроса, чтобы для каждой строки был присоединен самый низкий идентификатор "группы". Поскольку строки, которые строят «группу» сами по себе, или строки, которые уже имеют наименьший идентификатор «группы», не найдут строку партнера, нам нужно LEFT JOIN
. Теперь мы можем использовать объединенный младший идентификатор или идентификатор самой строки, если не было присоединено ни одной строки партнера, в качестве идентификатора «группы» с использованием coalesce()
.
SELECT coalesce(x.id1, t.id) groupid,
t.*
FROM elbat t
LEFT JOIN (SELECT t1.id id1,
t2.id id2
FROM elbat t1
INNER JOIN elbat t2
ON t2.product = t1.product
AND (t2.name = t1.name
OR t2.email = t1.email
OR t2.phone = t1.phone)
AND t2.id > t1.id) x
ON x.id2 = t.id
ORDER BY coalesce(x.id1, t.id);
Поскольку мы также упорядочиваем по идентификатору «группы», мы можем последовательно просматривать результат в любом приложении и знать, если идентификатор «группы» изменяется, мы читаем первую строку новой «группы».
дб <> скрипка