У меня есть список строк. У каждой из них есть категории, разделенные знаком «/».
Например:
животные / домашние / собака
животные / домашние / кошка
Что я хочу сделать с этими категориями, так это вставить их в таблицу категорий MySql. В таблице 4 столбца: id (int auto increment), category_name (nvarchar), parent_id (int), is_active (bit).
Логика их вставки должна быть следующей:
Для основных категорий (животных) значение parent_id должно быть равно 0.
Дочерние категории будут иметь идентификатор своего родителя как parent_id.
Не может быть двух активных категорий с одним и тем же названием.
Я попытался реализовать следующую логику:
Получите четкий список строк.
Из них составьте четкий список основных категорий.
Вставьте отдельные основные категории в таблицу категорий с родительским идентификатором 0.
Разделите каждую из категорий попарно и получите отдельные пары:
(животные, домашние)
(домашние, собачьи)
(Домашняя кошка)
- Получите соответствующий идентификатор для каждой из родительских категорий и вставьте его в parent_id дочернего элемента.
SQL:
/*INSERT ALL THE FIRST PARENT CATEGORIES WITH A PARENT ID OF 0*/
INSERT INTO categories (category_name, parent_id, is_active)
VALUES ('animals', 0, 1);
/*INSERT ALL THE CATEGORIES IN PAIRS TO TEMP TABLE*/
CREATE TEMPORARY TABLE tempcat(parent nvarchar(256), child nvarchar(256));
INSERT INTO tempcat
VALUES ('animals', 'domestic'),('domestic', 'dog'),('domestic','cat');
/*INSERT INTO THE CATEGORIES TABLE*/
INSERT INTO categories(category_name, parent_id, is_active)
SELECT tempcat.child, categories.id, 1
FROM categories
INNER JOIN tempcat
ON categories.category_name = tempcat.parent;
WHERE categories.is_active = 1;
/*DISPOSE THE TEMPORARY TABLE*/
DROP TEMPORARY TABLE tempcat;
Проблема: после выполнения запроса я ожидаю 4 записи в таблице категорий.
Но я получаю только 2.
Я вижу, что временная таблица имеет правильные записи до выполнения последнего внутреннего соединения. Я не могу понять, почему в таблице категорий не было двух других строк.
Мы высоко ценим любые указания в правильном направлении.
Обновление №1. Предположим, что в спецификациях указано: «Не может быть двух активных категорий с одним и тем же именем категории и с одинаковыми родительскими идентификаторами». Например, если было две строки как (животные / домашняя / кошка), (животные / на улице / кошка), должно быть две записи для кошки с идентификаторами домашнего и уличного как parent_id.