Пометить дубли в MySql таблице

Ладно с двумя полями, как бы по одному полю удалить корректно.
Делаю запрос:
PHP:
SELECT name, COUNT(name) AS cnt
FROM tablename GROUP BY name
HAVING ( COUNT(name) > 1 )
Он выводит количество дублей.
Удаляю так:
PHP:
DELETE t1 FROM tablename t1, tablename t2 WHERE t1.name=t2.name AND t1.ID > t2.ID
Но удаляется раза в 3 больше записей чем находится предыдущим запросом.
2-й запрос (тот, который на удаление) должен удалить количество строк, выдаваемых запросом:
PHP:
SELECT
(# общее количество строк в таблице tablename, которые имеют не уникальный name
 SELECT SUM(cnt) FROM 
 (SELECT NAME, COUNT(NAME) AS cnt
  FROM tablename GROUP BY NAME
  HAVING ( COUNT(NAME) > 1 )
 )x1
)
-
(# количество name, которые встречаются в таблице tablename более одного раза
 SELECT COUNT(*) FROM
 (SELECT NAME, COUNT(NAME) AS cnt
  FROM tablename GROUP BY NAME
  HAVING ( COUNT(NAME) > 1 )
 )x2
) 
AS rowsToDel
так что запрос на удаление, удаляя "в 3 раза больше строк" все делает правильно. это вы не правильно интерпретируете результат 1-го запроса.
snpru написал(а):
Нужно удалить записи из таблицы, у которых 2 поля одинаковые.
Поля code и name, если у 2ух строк оба этих поля совпадают то удалять, если совпадает лишь одно поле, то оставляем.
=>
PHP:
DELETE 
  t1 
FROM
  tablename t1,
  tablename t2 
WHERE t1.ID > t2.ID 
  AND t1.code = t2.code
  AND t1.name = t2.name
производительность этого запроса ужасная. но, если вам нужно для однократного применения, то это ничего страшного.
 
DrakonHaSh, получается удаляю я верно, но вывожу список дублей не верно?
 
DrakonHaSh, получается удаляю я верно, но вывожу список дублей не верно?
вы все делаете верно.
вы, как мне показалось, не верно интерпретируете то, что выдает запрос
PHP:
SELECT name, COUNT(name) AS cnt
FROM tablename GROUP BY name
HAVING ( COUNT(name) > 1 )
он выдает не список дублей, а список name, которые встречаются в исходной таблице более одного раза.
допустим есть таблица:
name
x1
x1
x1
x2
x3
x3
x4
тогда вышеприведенный запрос выдаст:
name / COUNT(name)
x1 / 3
x3 / 2
а запрос на удаление удалит 3 записи.
а если бы x1, например, встречался бы 10 раз, а x3 - 4 раза,то :
name / COUNT(name)
x1 / 10
x3 / 4
то запрос на удаление удалил бы 12 записей ( 10+4(сумма счетчиков) - 2(кол-во строк) )
 
Назад
Сверху