|
|
|
| Пользуюсь такой организацией каталога: http://webscript.ru/stories/04/09/01/8197045
Примерно так выглядит схематично каталог:
• Товары группы # 1
••• Подкатегория # 1
•••••• Товар ...
•••••• Товар ...
•••••• Товар ...
••• Подкатегория # 2
•••••• Товар ...
• Товары группы # 2
••• Подкатегория # 1
•••••• "Подподкатегория"
••••••••• Товар ...
••••••••• Товар ...
••••••••• Товар ...
••• Подкатегория # 2
•••••• Товар ...
То есть, как видно, вложенность может быть произвольная, поэтому Nested Sets и использую.
Проблема возникла при подсчете товаров в каждой из подкатегорий. Например, изначально должен быть такой список:
• Товары группы # 1 (4)
• Товары группы # 2 (4)
Потом в "Товары группы # 1":
••• Подкатегория # 1 (3)
••• Подкатегория # 2 (1)
И так далее.
Структура таблицы:
CREATE TABLE `items` (
`id` int(10) NOT NULL auto_increment,
`name` varchar(150) NOT NULL default '',
`left_key` int(10) NOT NULL default '0',
`right_key` int(10) NOT NULL default '0',
`level` int(10) NOT NULL default '0',
`is_item` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`id`),
) TYPE=MyISAM ;
|
Отличить товар от "папки" позволяет "is_item".
Постараюсь по-простому объяснить принцип Nested Sets: каждый раздел каталога имеет свои left_key и right_key - какой-то диапазон ключей. Так вот потомки такого каталога имеют такие left_key и right_key, которые входят в этот диапазон. По приведенной ссылке, кстати, первая картинка неплохо это иллюстрирует.
Пример запроса на выборку подразделов каталога с left_key и right_key соотвественно 1и 6: SELECT * FROM `items` WHERE `left_key` > 1 AND `right_key` < 6 AND `level` = 2 ORDER BY `name`; (level нужно для выборки именно подкаталогов, а не подподкаталогов и товаров).
Так вот как можно усовершенствовать запрос, чтобы к данным подраздела добаилась колонка с количеством товаров? | |
|
|
|
|
|
|
|
для: Orc
(11.07.2008 в 16:49)
| | >Отличить товар от "папки" позволяет "is_item".
Чтобы отличать товары от папок, их следует описывать разными таблицами. И сущности не путать. | |
|
|
|
|
|
|
|
для: Trianon
(11.07.2008 в 16:57)
| | Хм...Допустим, "is_item" удалю. Все данные товаров перенесу в отдельную таблицу, в которой будет дополнительное поле "section_id", которое будет равно идентификатору того подкаталога, в котором располагается товар. Как тогда можно будет организовать подсчет?..
P.S. Да и еще: смешанных каталогов не будет, то есть если в каталоге товары, но подкаталогов там уже не будет. | |
|
|
|
|
|
|
|
для: Orc
(11.07.2008 в 17:20)
| | Как-то так:
SELECT h.id, h.name, COUNT(p.id)
cats h
JOIN cats с ON c.letf_key >= h.left_key
AND c.right_key <= h.right_key
JOIN products p ON p.cat_id = cats.id
GROUP BY h.id, h.name;
ORDER BY h.left_key, h.name
|
cats - таблица категорий
products - таблица товаров | |
|
|
|
|
|
|
|
для: Trianon
(11.07.2008 в 17:40)
| | Спасибо. Вышло так:
SELECT `h`.*, COUNT(`p`.`id`) AS `cnt` FROM `cats` `h`
JOIN `cats` `c` ON `c`.`left_key` >= `h`.`left_key` AND `c`.`right_key` <= `h`.`right_key`
JOIN `products` `p` ON `p`.`cat_id` = `c`.`id`
WHERE `h`.`level` = 1
GROUP BY `h`.`id`, `h`.`name`
ORDER BY `h`.`left_key`, `h`.`name`;
|
Но такой запрос не выводит разделы каталога, которые не содержат товаров. Как можно модифицировать запрос?.. | |
|
|
|
|
|
|
|
для: Orc
(11.07.2008 в 21:14)
| | >Но такой запрос не выводит разделы каталога, которые не содержат товаров. Как можно модифицировать запрос?..
наверное LEFT JOIN `products` | |
|
|
|
|
|
|
|
для: Trianon
(11.07.2008 в 21:16)
| | Спасибо. | |
|
|
|