Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Дубликаты, помогите удалить пожалуйста / 5 сообщений из 5, страница 1 из 1
09.09.2014, 22:59:26
    #38742267
userlive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дубликаты, помогите удалить пожалуйста
Добрый вечер!
Помогите пожалуйста удалить дубликаты.
Есть таблица значений, 2 млн. строк:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE IF NOT EXISTS `properties` (
  `id` bigint(13) unsigned NOT NULL COMMENT,
  `No` int(11) unsigned NOT NULL,
  `PropertyID` int(11) unsigned NOT NULL,
  `Sorting` int(5) unsigned NOT NULL DEFAULT '0',
  `Value` text NOT NULL
) ENGINE=innoDB DEFAULT CHARSET=utf8;

ALTER TABLE `properties`
 ADD UNIQUE KEY `id` (`id`), ADD KEY `PropertyID` (`PropertyID`), ADD KEY `PropertyID_2` (`PropertyID`,`No`);



И есть таблица с именами этих значений, 9 тыс. строк:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE IF NOT EXISTS `properties_name` (
  `id` int(11) unsigned NOT NULL,
  `name` varchar(255) NOT NULL DEFAULT '0'
) ENGINE=innoDB DEFAULT CHARSET=utf8;

ALTER TABLE `properties_name`
 ADD PRIMARY KEY (`id`), ADD KEY `name` (`name`), ADD KEY `name_id` (`name`,`id`);



В колонке PropertyID таблицы properties содержаться идентификаторы таблицы properties_name (колонка id)
В таблице properties_name есть много одинаковых имен с разными идентификаторами.
В таблице properties в колонке PropertiesID разные идентификаторы, но имена под этими id в таблице properties_name в большинстве случаев одинаковые.

Делаюсь запрос который по идеи все необходимые строки в таблице ptoperties должен привести к единому идентификатору:
Код: sql
1.
UPDATE properties as p SET p.PropertyID = (SELECT MIN(id) FROM properties_name WHERE name LIKE (SELECT name FROM properties_name WHERE id=p.PropertyID)) WHERE p.PropertyID IN(SELECT id FROM properties_name WHERE id NOT IN(SELECT min(id) FROM properties_name GROUP BY name HAVING count(*)>1))


Mysql уходит в нескончаемый аут.
...
Рейтинг: 0 / 0
09.09.2014, 23:57:23
    #38742296
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дубликаты, помогите удалить пожалуйста
userlive,

я бы пошол по пути

1)временая таблица для проперти-неймс

2)там поставить индекс уникальности, дабы имя свойства не дублировалось.

3вставка из основной в временую с ИГНОР опцией - тогда дубли проигнорируються и не будут вставлены

4дальше бы обновлял ссылки используюя две таблицы названий опций
5 удалил бы дублирующие имена опций
...
Рейтинг: 0 / 0
10.09.2014, 10:13:19
    #38742511
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дубликаты, помогите удалить пожалуйста
Запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
select t1.id, t2.id
from properties_name t1,
( select min(id) id, name
  from properties_name
  group by name
) t2
where t1.name=t2.name;


позволит получить данные, необходимые для обновления таблицы properties - замена текущего PropertyID на минимальное PropertyID.
После Update таблицы PropertyID останется удалить из таблицы properties_name все записи, для которых t1.id != t2.id
...
Рейтинг: 0 / 0
10.09.2014, 17:23:19
    #38743355
userlive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дубликаты, помогите удалить пожалуйста
Akina,

Cпасибо, это помогло обновить чуть больше полумиллиона строк за 1 минут в таблице properties.

Собственно сам запрос к таблице properties получился таким:
Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE 
	properties as p,
	(select t1.id as required_id, t2.id as replace_id from properties_name as t1, ( select min(id) id, name from properties_name group by name HAVING count(*)>1) as t2 where t1.name=t2.name) as pid
SET
	p.PropertyID = pid.replace_id
WHERE
	p.PropertyID = pid.required_id;
...
Рейтинг: 0 / 0
10.09.2014, 18:51:46
    #38743502
userlive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дубликаты, помогите удалить пожалуйста
Этот запрос удаляет дубликаты из таблицы properties_name
Код: sql
1.
2.
3.
4.
5.
6.
7.
DELETE
	del.*
FROM
	properties_name as del,
	(SELECT id FROM properties_name, (SELECT min(id) as i, name as n FROM properties_name GROUP BY name HAVING count(*)>1) as t where id != t.i AND t.n=name) as iid
WHERE
	del.id = iid.id
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Дубликаты, помогите удалить пожалуйста / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]