Я разрабатываю N-мерный каталог продукции, то меж каталог с подкатегориями неограниченной вложенности, Задумка такая, что у товара может быть миниум одна, а максиум N (Ну, для начала, N не менее 5-ти, но задумка сделать НЕ ограниченным) и если в чистой категории (pid=0) можно создать или товар или подкатегорию. Если создаём подкатегорию, то этой новосозданной подкатегории в поле pid записывается id родительской категории (род, кат,), и в род, кат, отныне можно создавать только подкатегории (товары уже НЕльзя), до тех пор, пока из неё не будут удалены все подкатегории, А если же мы в род, кат, создаём товар, то в таблице товаров полю link_id созданного товара присваивается id род,кат,, и в ней мы теперь можем создавать только товары, пока не будут из таблицы удалены все товары. Пока стандартная схема 3-ёх уровнего каталога, но фишка в том, что поле pid таблицы категорий не INT, а VARCHAR, и когда мы в категории 2-ого уровня (К2) создаём К3, то в pid записываются через запятую id род, кат, начиная с самой верхней, Томеж если в К1 с id=1 pid=0, создали К2 у которой id=2 и pid=1, и в ней создали К3 у которой id=3, то pid у ней будет равен pid='1,2' и т,д, Вот упрощённая структура таблицы с тестовым дампом:
CREATE TABLE `test` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `pid` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '', `title` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;INSERT INTO `test` (`id`,`pid`,`title`) VALUES (1,'0','Кат 1'), (2,'0','Кат 2'), (3,'0','Кат 3'), (4,'1','Кат 1.1'), (5,'1','Кат 1.2'), (6,'1','Кат 1.3'), (7,'1,4','Кат 1.1.1'), (8,'1,4','Кат 1.1.2'), (9,'1,4','Кат 1.1.3'), (10,'1,5','Кат 1.2.1'), (11,'1,5','Кат 1.2.2'), (12,'1,5','Кат 1.2.3'), (13,'1,6','Кат 1.3.1'), (14,'1,6','Кат 1.3.2'), (15,'1,6','Кат 1.3.3'), (16,'2','Кат 2.1'), (17,'2','Кат 2.2'), (18,'2','Кат 2.3'), (19,'0','Кат 4'); Для того, что бы узнать какая категория последняя (не имеющая детей, следовательно или имеющая товары или пустая), а какая родительская (имеющая детей, следовательно имеющая подкатегории) Мне нужно отделить группу "Последних id" (3,7,8,9,10,11,12,13,14,15,16,17,18,19) которые или пустые или содержат товары, и группу "Промежуточных id" (1,2,4,5,6)А вот теперь самое интересное,,, По моей задумке для выделения "Промежуточноых id" я хотел использовать запрос: SELECT * FROM `test` WHERE `id` IN(SELECT `pid` FROM `test`); То меж выделить id, которые указаны в pid причём всё равно в как и в каком порядке, так как id в pid я отделил запятыми, я надеялся что синтаксисом IN подобная запись интерпретируется в последовательность id через запятую, но на практике происходит приведение данных к INT и строка '1,4' преобразовывается в '1' и результат совсем не тот, который я ожидал. Можно ли что то с этим сделать, или как по другому записать запрос, например используя оператор LIKE ? Ведь в LIKE можно подставлять только значения столбца, а не имя столбца, да ещё и с конкатенацией шаблона, к имени каждого столбца, Помогите пожалуйста смоделировать нужный запрос, результатом которого была бы выборка из таблицы с id 1,2,4,5,6 :))
|