К списку форумов К списку вопросов
Удаление одинаковых строк в MySQL
Jup
28.04.2004 - 21:12
Как удлаить одинаковые (быть может за исключением автоинкрементного id)строки из таблицы?
Спасибо.
Deflorator
1 - 28.04.2004 - 22:12
может, записи?
буратин
2 - 28.04.2004 - 22:35
циклом.
уверен, сервер не знает какие записи для тебя одинаковые. ему нужны значения и имена полей.
буратин
3 - 28.04.2004 - 22:46
т.е. DELETE FROM таблица WHERE имя_поля1=значение AND имя_поля2=значение2 LIMIT 1;
а если DELETE FROM таблица WHERE имя_поля1=имя_поля1 AND имя_поля2=имя_поля2 LIMIT 1, то будет удалять по порядку.
Jup
4 - 28.04.2004 - 23:07
Спасибо, но вы, видимо, немного не поняли задачу.
Некоторые стандарты СУБД основываются на том, что в таблице нет одинаковых строк (записей, кортежей - кому как больше нравится).
А задача такая есть таблица с 3-мя полями (атрибутами, столбцами - тоже дело терминологии). 1-е автоинкрементный id, другие 2 просто некоторого типа. Так вот, нужно из таблицы удалить дублирующие записи, т.е. те у которых значения 2-го и 3-го поля совападают с теми же значиениями другой записи.
Jup
5 - 28.04.2004 - 23:10
Решение в цикле перебора по каждой не устраиватет, т.к. это "в лоб". Я думаю, что это задача для которой должно существовать изящное решение.
Trial
6 - 28.04.2004 - 23:45
в лоб - это вот это:
create temporary table tmp (id int);
insert into tmp select distinct(t1.id) from tbl as t1 tbl as t2 where t1.id<>t2.id and t1.fld1=t2.fld1 and t1.fld2=t2.fld2
delete from tbl USING tbl,tmp where tmp.id=tbl.id
Trial
7 - 28.04.2004 - 23:47
Это удалит все записи имеющие дубликаты.
buster
8 - 29.04.2004 - 00:29
Если первое - автоинкрементное, то записи уже не будут одинаковыми.
Jup
9 - 30.04.2004 - 08:36
2 Trial - ну я бы не сказал что это прямо в лоб, хотя и не изящно. И к тому же это удаляет все записи, которые имеют дубликаты, а мне надо оставить по одной, просто что бы не повторялись.
2 buster - а ты закрой глаза и представь что автоинкрементного поля нет :)
buster
10 - 30.04.2004 - 09:51
Я-то глаза закрыть могу, а СУБД работает только формально. Если не понимаешь этого — получится у тебя любви с компьютером :о)) Пиши стихи :о))
buster
11 - 30.04.2004 - 09:52
мммм... не получится, то-есть :о))
буратин
12 - 30.04.2004 - 11:54
оператор DELETE работает с условием(condition), которое не получится составить так: ...а одну запись, пожалуйста, оставьте...
SELECT COUNT()
mysql_num_rows()
DELETE FROM
DIVЕR
13 - 30.04.2004 - 12:50
Буквально пару недель назад была ЭТА ЖЕ тема, с почти таким же сабжем. Поищите на пару страниц вперёд, там я дал вполне подходящее решение.
Кстати, не "в лоб" не получится, надо в любом случае перебирать все записи и искать одинаковые.
buster
14 - 30.04.2004 - 12:51
В общем, выбирай записи, которые неодинаковые, очищай всю таблицу и вставляй выбранные записи туда опять... и всё у тебя получится
v2d
15 - 30.04.2004 - 16:25
Резюмируя buster-а:
create temporary table tmp select field2,field3 from tbl group by field2,field3;
delete from tbl;
insert into tbl (field2,field3) select * from tmp;
DIVЕR
16 - 01.05.2004 - 19:43
http://www.kuban.ru/cgi-bin/forum/forum28.cgi?page=5&ask=9661

К списку вопросов на форуме Веб-дизайн

>>