У меня есть список строк. У каждой из них есть категории, которые разделены символом '/'.
Например:
животные / домашние / собака
животные / домашние / кошка
Что я хочу сделать с этими категориями, это вставить в таблицу категорий MySql. Таблица имеет 4 столбца: id (int с автоматическим приращением), category_name (nvarchar), parent_id (int), is_active (бит)
Лог c вокруг их вставки должен выглядеть следующим образом:
Основные категории (животные) должны иметь parent_id = 0.
Дочерние категории будут иметь идентификатор своего родителя в качестве parent_id.
Не может быть двух активных категорий с одной и той же категорией имя.
Я пытался реализовать следующие логи c:
Получить отдельный список строк.
Из них получите четкий список основных категорий.
Вставьте отдельные основные категории в таблицу категорий с родительским идентификатором 0.
Организуйте каждую из категорий в парах и получайте отдельные пары:
(животные, домест c)
(домест c, собака)
(домест c, кошка)
Получите соответствующий идентификатор для каждой из родительских категорий и вставьте его в 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;
Проблема: после запуска запроса I Ожидайте 4 записи в таблице категорий.
Но я получаю только 2.
Я вижу, что временная таблица содержит правильные записи перед выполнением последнего внутреннего соединения. Я не могу понять, почему в таблице категорий не было двух других строк.
Любые указания в правильном направлении очень ценятся.
Обновление # 1 Предположим, что спецификации гласят: «Не может быть двух активных категорий с одинаковым именем категории , имеющих одинаковые родительские идентификаторы ». Например, если было две строки, такие как (животные / домашние / кошка), (животные / на открытом воздухе / кошка), должно быть две записи для кошки с идентификаторами доменных c и наружных как parent_id.