powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Дубликаты, помогите удалить пожалуйста
5 сообщений из 5, страница 1 из 1
Дубликаты, помогите удалить пожалуйста
    #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
Дубликаты, помогите удалить пожалуйста
    #38742296
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
userlive,

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

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

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

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

4дальше бы обновлял ссылки используюя две таблицы названий опций
5 удалил бы дублирующие имена опций
...
Рейтинг: 0 / 0
Дубликаты, помогите удалить пожалуйста
    #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
Дубликаты, помогите удалить пожалуйста
    #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
Дубликаты, помогите удалить пожалуйста
    #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
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Дубликаты, помогите удалить пожалуйста
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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