|
|
|
| Нужно сделать одним запросом.
Есть две таблицы: таблица категорий и таблица товаров связанные между собой по ключу catid. Так же в таблице категорий некоторые записи связаны между собой по ключам catid и parent, т.е. в parent хранится значение ключа предка
--
-- Структура таблицы `cats`
--
CREATE TABLE `cats` (
`catid` int(5) NOT NULL auto_increment,
`parent` int(5) NOT NULL default '0',
`name` varchar(10) NOT NULL default '',
PRIMARY KEY (`catid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;
--
-- Дамп данных таблицы `cats`
--
INSERT INTO `cats` VALUES (1, 0, 'root');
INSERT INTO `cats` VALUES (2, 1, 'w');
INSERT INTO `cats` VALUES (3, 2, 'e');
INSERT INTO `cats` VALUES (4, 3, 'r');
INSERT INTO `cats` VALUES (5, 4, 't');
INSERT INTO `cats` VALUES (6, 4, 'y');
-- --------------------------------------------------------
--
-- Структура таблицы `prods`
--
CREATE TABLE `prods` (
`prodid` int(5) NOT NULL auto_increment,
`catid` int(5) NOT NULL default '0',
`name` varchar(10) NOT NULL default '',
PRIMARY KEY (`prodid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;
--
-- Дамп данных таблицы `prods`
--
INSERT INTO `prods` VALUES (1, 1, 'a');
INSERT INTO `prods` VALUES (2, 2, 's');
INSERT INTO `prods` VALUES (3, 3, 'd');
INSERT INTO `prods` VALUES (4, 4, 'f');
INSERT INTO `prods` VALUES (5, 5, 'g');
INSERT INTO `prods` VALUES (6, 6, 'h');
|
| |
|
|
|
|
|
|
|
для: Hamilion
(21.05.2008 в 18:49)
| | Одним запросом в выбранной схеме представления дерева - никак. Применяйте схему nested sets - она как раз для этого предназначена. | |
|
|
|
|
|
|
|
для: Trianon
(21.05.2008 в 18:52)
| | Ясно. А что, если заранее известна глубина вложенности, т.е. каталог будет выглядить Категория1->под-категория1->под-категория2->под-категория3
и товары будут храниться не глубже под-категория3 (у меня как раз так и сделано)? Реально ли одним запросом? | |
|
|
|
|
|
|
|
для: Hamilion
(22.05.2008 в 10:25)
| |
SELECT c0.name AS catname, prods.*
FROM cats as c3
LEFT JOIN cats as c2 ON c2.catid = c3.catid OR c2.catid = c3.parent
LEFT JOIN cats as c1 ON c1.catid = c2.catid OR c1.catid = c2.parent
LEFT JOIN cats as c0 ON c0.catid = c1.catid OR c0.catid = c1.parent
JOIN prods ON prods.catid = c0.catid
WHERE c3.catid = $catid
|
как-то так... | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2008 в 11:18)
| | Вот так работает. | |
|
|
|
|
|
|
|
для: Trianon
(21.05.2008 в 18:52)
| | Ворос в тему.
Trianon, вам не встречалась удобная библиотека для работы конкретно с nested sets деревьями? | |
|
|
|
|
|
|
|
для: Axxil
(22.05.2008 в 11:35)
| | Да я, собственно, не эксперт... | |
|
|
|
|
|
|
|
для: Axxil
(22.05.2008 в 11:35)
| | Нашел вот это http://php.russofile.ru/ru/authors/sql/nestedsets01, но не знаю насколько она удобная | |
|
|
|
|
|
|
|
для: Hamilion
(22.05.2008 в 12:34)
| | Сенкс, посмотрим. | |
|
|
|
|
|
|
|
для: Axxil
(22.05.2008 в 11:35)
| | Я работаю с PEAR DB_NestedSet
Есть практически все возможные операции с деревом: перемещение, копирование узлов, несколько вариантов вывода данных...
http://pear.php.net/manual/en/package.db_nestedset.php | |
|
|
|
|
|
|
|
для: Anatoly_ua
(22.05.2008 в 13:16)
| | PEAR мне не нравится из-за ненужной громозкости библиотек. Для любого чиха там универсальных монстров пишут.
А с этим пакетом как? Не сильно громоздкий? (пока нет времени посмотреть, а то сам бы конечно разобрался)
> несколько вариантов вывода данных...
вот-вот ;-) зачем они нужны, эти несколько вариантов?
По сути для дерева надо 3 операции
Добавление узла/ветки
Удаление узла/ветки
Перемещение/копирование узла/ветки | |
|
|
|
|
|
|
|
для: Axxil
(22.05.2008 в 14:16)
| | На самом деле все эти дополнительные возможности лежат в дополнительных файлах, т.е. если вы их не используете, то они и не грузятся. Единственное, что в качестве драйвера к БД ему нужен DB, MDB или MDB2, ну и все PEAR библиотеки используют PEAR класс (расширяют его). Но я не встречал еще класса для работы с nested sets, которые бы не использовали какой-нибудь внешний драйвер к БД | |
|
|
|
|
|
|
|
для: Anatoly_ua
(22.05.2008 в 14:46)
| | Нашёл отличное решение.
http://blog.azazel.org.ua/2008/01/14/nested-sets/
Просто и ничего лишнего. Всё, что ещё может понадобится (если вообще понадобится) можно доделать самостоятельно. Легко понимается, изменяется, интегрируется куда угодно (за 20 минут воткнул в свой проект, где используется самописный драйвер баз).
Короче, надо брать :) | |
|
|
|
|
|
|
|
для: Trianon
(21.05.2008 в 18:52)
| | Переделал свою базу под NESTED SETS, как теперь мне ответить на вопрос темы? | |
|
|
|
|
|
|
|
для: Hamilion
(26.05.2008 в 14:57)
| |
SELECT c0.name AS catname, prods.*
FROM cats AS c1
LEFT JOIN cats AS c0 ON c0.la >= c1.la AND c0.lb < c1.lb
JOIN prods ON prods.catid = c0.catid
WHERE c1.catid = $catid
|
как-то так... | |
|
|
|