Подтвердить что ты не робот

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", которые я видел, используют только один столбец для сравнения.

4b9b3361

Ответ 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
  )

надеюсь, что это имеет смысл.:)