удалить дубликаты : q?

kvn

programmer
удалить дубликаты : q?

люди:
есть таблица:
id, serial - оба числа.

так получилось, что в БД оказались некоторые serial - дублированные.
но id у них разное.

Вопрос: как удалить дубликаты без особо критичных действий с таблицей..

Помогите плиз.
Спасибо.

П.С. бд: mysql,

структура таблицы:

CREATE TABLE logos (
id int(10) unsigned NOT NULL auto_increment,
serial int(10) unsigned NOT NULL default '0',
PRIMARY KEY (id),
KEY serial (serial),
) TYPE=MyISAM ;
 

aloner

Guest
SELECT s2.id FROM logos s1, logos s2 WHERE s1.id != s2.id AND s1.serial = s2.serial

А потом это удалить, по идее. Я с MySQL давно не работал.

Если она уже умеет поддерживать подзапросы, то еще проще:

DELETE FROM logos WHERE id IN (SELECT s2.id FROM logos s1, logos s2 WHERE s1.id != s2.id AND s1.serial = s2.serial)
 

su1d

Старожил PHPClubа
сначала загрузи в массив все ИД, которые содержат дубликаты:
Код:
SELECT logosA.id AS del_id
  FROM logos logosA
  INNER JOIN logos logosB ON 
    logosB.serial = logosA.serial AND 
    logosB.id <> logosA.id
GROUP BY logosA.id
потом получи массив с ИД, которые надо оставить:
Код:
SELECT id AS save_id
  FROM logos 
  WHERE id IN(del_id_values)
  GROUP BY serial
потом уже можно удалять:
Код:
DELETE FROM logos WHERE id IN(del_id_values) AND NOT IN(save_id_values)
ничего более простого как-то в голову пока не приходит =((
 

ForJest

- свежая кровь
Я бы предложил такой способ чтобы выбрать все id подлежащие удалению
PHP:
SELECT serial, max(id) id, count(id) cnt 
     FROM logos
     GROUP BY serial
     HAVING cnt>1;
Потом формируешь список этих id и
PHP:
DELETE FROM logos WHERE id IN ($id_list);
 

si

Administrator
Например так (если ID важен, если нет можно без GROUP BY, только DISTINCT):

Код:
insert into logos(serial) values(1), (2), (3),(1), (2), (3), (1), (2), (3), (1), (2), (3);  

mysql> SELECT *  FROM  logos; 
+----+--------+
| id | serial |
+----+--------+
|  1 |      1 |
|  2 |      2 |
|  3 |      3 |
|  4 |      1 |
|  5 |      2 |
|  6 |      3 |
|  7 |      1 |
|  8 |      2 |
|  9 |      3 |
| 10 |      1 |
| 11 |      2 |
| 12 |      3 |
+----+--------+
12 rows in set (0.00 sec)

mysql> CREATE TEMPORARY TABLE tmp SELECT min(id), serial  FROM  logos GROUP BY serial;                 
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> TRUNCATE TABLE logos;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO logos SELECT * FROM tmp;
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT *  FROM  logos;                                                                         
+----+--------+
| id | serial |
+----+--------+
|  1 |      1 |
|  2 |      2 |
|  3 |      3 |
+----+--------+
и не надо никаких РНР :)
 

kvn

programmer
ну, вот. Удалил я дубликаты (спасибо si), теперь, дабы это не повторялось хочу сделать:
ALTER TABLE logos ADD UNIQUE ( serial)

а оно мне: Duplicate key name 'serial'

Уже ж дубликатов то нет...я ж их только что кишнул..

Эт куда копать? Я не совсем фанат Мускла, даже совсем не фанат, так что не бейте сильно, но помощь очень нужна.
Спасибо.
 

kvn

programmer
Не понял?
Дублированных записесей в таблице в поле сериал - нет.
а ЮНИК не хочет делаться:
mysql> ALTER TABLE logos ADD UNIQUE ( serial) ; ERROR 1061: Duplicate key name 'serial'
mysql>

?
 

mahoune

Guest
Ну значит есть такой KEY - "SERIAL" но не уникальный
Делай DELETE KEY
Потом ADD
 
Сверху