SQL - как удалить дубль из базы?

12
R
На сайте с 20.08.2007
Offline
139
3603

Пока что есть у меня поиск:

SELECT title, count( * )

FROM jos_content

GROUP BY title

HAVING count( * ) >1

А как теперь удалить? :)

S
На сайте с 14.04.2008
Offline
60
#1

Вариант 1. Очевидный. Не сработает, если нет подходящего целочисленного уникального "id"

DELETE j1 FROM jos_content j1 LEFT JOIN jos_content j2 ON j1.title=j2.title AND j1.id > j2.id

Вариант 2. Не очевидный. Не проверял, но должно сработать :)

ALTER IGNORE TABLE jos_content ADD UNIQUE INDEX (title)

ALTER TABLE jos_content DROP INDEX (title)

R
На сайте с 20.08.2007
Offline
139
#2
DELETE j1 FROM jos_content j1 LEFT JOIN jos_content j2 ON j1.title=j2.title AND j1.id > j2.id

Очистил всю таблицу :) Не подходит

2й вариант с ошибкой. Я не очень в этом разбираюсь

Rchernovol добавил 08.08.2010 в 15:10

Хэлп, коллеги

[Удален]
#3
R
На сайте с 20.08.2007
Offline
139
#4

Phessiv, спасибо, так уже пробовал.

затронуты все строки, результат нулевой ((

U
На сайте с 11.05.2009
Offline
21
#5

Rchernovol, попробуйте dbForge Studio for MySQL

Z1
На сайте с 09.12.2005
Offline
164
#6
Rchernovol:
Phessiv, спасибо, так уже пробовал.
затронуты все строки, результат нулевой ((

Значит у Вас там не совсем дубли. Т.е. только в некоторых полях все значения одинаковые, а в некоторых разные.

Я бы в таком случае сделал так...

1) создал бы такую же таблицу..

CREATE TABLE `t2` LIKE `t1`

2) сделал бы то поле, где не должно был дублей уникальным

ALTER TABLE `t2` ADD UNIQUE (`a`)

или проще в пхпмуадмине, если несколько таких полей - то на все сразу вешать уник.

3)

INSERT IGNORE `t2` SELECT * FROM `t1`

Всё, в таблице `t2` только уникальные значения по тем полям, которые мы указали в п.2.

Дальше со второй таблицы снимаем тот UNIQUE индекс, удаляем первую, и переименовываем `t2` в `t1`.

[Удален]
#7

А вариант написать мини скриптик рассматривался?

CREATE TABLE `table2` AS SELECT DISTINCT * FROM `table1` приведет к тому, что у вас слетят все индексы, поэтому я делал выбоку и удалял ненужное средствами PHP.

R
На сайте с 20.08.2007
Offline
139
#8

Спасибо, по рецепту zweroboy1 вопрос решен.

S
На сайте с 14.04.2008
Offline
60
#9
Rchernovol:
Очистил всю таблицу :) Не подходит

2й вариант с ошибкой. Я не очень в этом разбираюсь

Shit happens. Что значит давно не практиковался. Две маленьких очепятки, которые испортили всю кашу.

В варианте 1 должно быть

DELETE j1 FROM jos_content j1 INNER JOIN jos_content j2 ON j1.title=j2.title AND j1.id > j2.id

чтобы все сработало

В варианте 2 нужно не забыть имя индекса

ALTER IGNORE TABLE jos_content ADD UNIQUE INDEX any_valid_name (title)

чтобы опять-таки все сработало

R
На сайте с 20.08.2007
Offline
139
#10

еще вопрос:

Есть колонка с датой такого вида - 2008-02-03 01:51:12

В ней много записей, и даты разные, но всё начинается с 2008

Например:

2008-03-13 01:51:12

2008-04-23 07:40:19

2008-05-05 04:22:26

Как обновить ее с 2008 до 2009? Притом, всё, что после года - месяцы, дни, минуты, секунды не должны изменяться. Эти значения должны остаться.

Помогите пожалуйста

Rchernovol добавил 30.08.2010 в 16:43

И еще:

В заголовке встречаются шесть цифр подряд + текст

как убрать эти цифры (они разные), оставив текст?

Например: "122314 Какой прекрасный день" > "Какой прекрасный день"

Но бывает и просто одна-две цифры встречаются. Вот они должны остаться.

Как убрать 6 цифр подряд?

Помогшего отблагодарю финансово.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий