MySQL выбирает записи для дубликатов, используя несколько столбцов
Я хотел бы выбрать записи из таблицы или вставить их в новую пустую таблицу, где несколько столбцов совпадают с другой записью в базе данных. Проблема аналогична этому Вопросу.
Найти дубликаты записей в MySQL
Однако это сравнивает только один столбец. Кроме того, один из моих столбцов, скажем, столбец C в приведенном ниже примере, является целым числом. Как и вопрос в ссылке выше, я хочу, чтобы каждая из строк была возвращена. К сожалению, я просто недостаточно разбираюсь в том, как работают совлокальные работы, чтобы понять это самостоятельно. Я знаю, что приведенный ниже код не похож на реальный код SQL-кода вообще, это самый ясный способ, который я могу описать, чтобы сравнить сравнения, которые я пытаюсь получить.
SELECT ColumnE, ColumnA, ColumnB, ColumnC from table where (
Row1.ColumnA = Row2.ColumnA &&
Row1.ColumnB = Row2.ColumnB &&
Row1.ColumnC = Row2.ColumnC
)
Любая помощь будет оценена, все ответы "select duplicates from MYSQL", которые я видел, используют только один столбец для сравнения.
Ответы
Ответ 1
Если вы хотите подсчитать дубликаты между несколькими столбцами, используйте group by
:
select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates
from table
group by ColumnA, ColumnB, ColumnC
Если вам нужны только дублирующиеся значения, то счет больше 1. Вы получаете это с помощью предложения having
:
select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates
from table
group by ColumnA, ColumnB, ColumnC
having NumDuplicates > 1
Если вы действительно хотите, чтобы все повторяющиеся строки возвращались, присоедините последний запрос к исходным данным:
select t.*
from table t join
(select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates
from table
group by ColumnA, ColumnB, ColumnC
having NumDuplicates > 1
) tsum
on t.ColumnA = tsum.ColumnA and t.ColumnB = tsum.ColumnB and t.ColumnC = tsum.ColumnC
Это будет работать, если ни одно из значений столбца не равно NULL. Если да, попробуйте:
on (t.ColumnA = tsum.ColumnA or t.ColumnA is null and tsum.ColumnA is null) and
(t.ColumnB = tsum.ColumnB or t.ColumnB is null and tsum.ColumnB is null) and
(t.ColumnC = tsum.ColumnC or t.ColumnC is null and tsum.ColumnC is null)
Ответ 2
почему бы вам не попробовать использовать объединение или создать временную таблицу. но лично я рекомендую использовать объединение, а не создавать временную таблицу, потому что это займет у вас больше времени. попробуйте сделать это:
select field1, field2 from(
select '' as field2, field1, count(field1) as cnt FROM list GROUP BY field2 HAVING cnt > 1
union
select ''as field1, field2, cound(field2) as cnt from list group by field1 having cnt > 1
)
надеюсь, что это имеет смысл.:)