Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Nested Sets и подсчет товаров
 
 автор: Orc   (11.07.2008 в 16:49)   письмо автору
 
 

Пользуюсь такой организацией каталога: 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 нужно для выборки именно подкаталогов, а не подподкаталогов и товаров).

Так вот как можно усовершенствовать запрос, чтобы к данным подраздела добаилась колонка с количеством товаров?

   
 
 автор: Trianon   (11.07.2008 в 16:57)   письмо автору
 
   для: Orc   (11.07.2008 в 16:49)
 

>Отличить товар от "папки" позволяет "is_item".
Чтобы отличать товары от папок, их следует описывать разными таблицами. И сущности не путать.

   
 
 автор: Orc   (11.07.2008 в 17:20)   письмо автору
 
   для: Trianon   (11.07.2008 в 16:57)
 

Хм...Допустим, "is_item" удалю. Все данные товаров перенесу в отдельную таблицу, в которой будет дополнительное поле "section_id", которое будет равно идентификатору того подкаталога, в котором располагается товар. Как тогда можно будет организовать подсчет?..

P.S. Да и еще: смешанных каталогов не будет, то есть если в каталоге товары, но подкаталогов там уже не будет.

   
 
 автор: Trianon   (11.07.2008 в 17:40)   письмо автору
 
   для: 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 - таблица товаров

   
 
 автор: Orc   (11.07.2008 в 21:14)   письмо автору
 
   для: 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`;


Но такой запрос не выводит разделы каталога, которые не содержат товаров. Как можно модифицировать запрос?..

   
 
 автор: Trianon   (11.07.2008 в 21:16)   письмо автору
 
   для: Orc   (11.07.2008 в 21:14)
 

>Но такой запрос не выводит разделы каталога, которые не содержат товаров. Как можно модифицировать запрос?..

наверное LEFT JOIN `products`

   
 
 автор: Orc   (11.07.2008 в 21:29)   письмо автору
 
   для: Trianon   (11.07.2008 в 21:16)
 

Спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования