EnChikiben
@EnChikiben

Перемещение данных и группирование?

Доброе утро!


Есть две таблицы:

Рубрики:
idname_section



Товары:
idid_sectionname_goods



И так получилось что товары начинают дублироваться, во избежания избыточности данных решил вставить промежуточную таблицу связи.


Связи:
idid_goodsid_section



Сейчас надо как то переместить уже имеющиеся товары в связи удалить дубли и обновить записи там где дубли были удалены. Сейчас придумал только так:

1. Переместить все товары в связи без повторений (временно создать в ней поле название товара).

2. Выбрать все повторяющиеся товары (тут надо использовать таблицу связей) из таблицы товаров и занести их в связи но с номером товара из таблицы связи, а номер раздела оставить старый.

3. Удалить из таблицы товаров дубли и столбец рубрик.


Подскажите может есть у кого нибудь опыт подобной работы и знания запросов.

// ищем одинаковые<br/>
SELECT <br/>
t1.`id_section`,<br/>
t1.`id_goods`,<br/>
t1.`name_goods`,<br/>
t2.`id_goods`,<br/>
t2.`id_section`<br/>
FROM im_goods as t1, im_goods as t2 <br/>
WHERE <br/>
t1.`name_goods`=t2.`name_goods` AND t1.`id_goods`&lt;&gt;t2.`id_goods`<br/>
ORDER BY `t1`.`name_goods`<br/>
  • Вопрос задан
  • 2425 просмотров
Решения вопроса 1
Shedal
@Shedal
CREATE TABLE im_goods_new (
   id int(10) unsigned zerofill NOT NULL auto_increment,
   name varchar(255) NOT NULL,
   PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

INSERT INTO im_goods_new
SELECT DISTINCT name_goods
FROM im_goods;

INSERT INTO im_goods_sections (id_goods, id_section)
SELECT DISTINCT new.id, old.id_section
FROM im_goods_new new
JOIN im_goods old
  ON new.name = old.name_goods;
  
DROP TABLE im_goods;

RENAME TABLE im_goods_new TO im_goods;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ilyaplot
@ilyaplot
PHP программист
Если нужно лишь удалить дубли, тогда
DELETE t1 FROM table t1, table t2 WHERE t1.name=t2.name AND t1.ID > t2.ID

А обновление записи… Ну тут я не подскажу к сожалению.
Ответ написан
Комментировать
@egorinsk
Если надо запретить создание товаров с одинаковыми именами, надо сделать UNIQUE INDEX по полю name_goods. Чтобы индекс не стал огромным уродливым тормозящим монстром, его надо объявлять примерно так (ограничить размер индексируемой подстроки):

ALTER TABLE im_goods ADD UNIQUE INDEX ix_name ( name_goods(10) );

Тогда БД не позволит вам вставлять 2 товара с одинаковым названием (смотрите, чтобы это не было потом сюрпризом).

Хотя, может, я вас не так понял.

P.S. Советую также в следующий раз правильно называть поля, чтобы не коробило глаза понимающих английский: товар = product, название = product_name, ид товара = product_id, рубрика = category. Вдруг будете для американцев например делать магазин, пригодится.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы