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

Форум MySQL

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

 

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

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

тема: Двухтабличный запрос
 
 автор: newmen   (31.05.2007 в 02:57)   письмо автору
 
 

Помогите сформировать запрос. Есть две таблицы:
1. Категории (неограниченная вложенность)
2. Продукция.

Вложенность категорий определяется полем parent, родитель - 0.
Товар присваивается определенной категории по полю id_category.

Нужно составить один запрос чтобы вывести категории определенного родителя, например, parent=0 и отобразить сколько у выведеных категорий подкатегорий и сколько товаров.

Помогите плиз, а то уже голову сломал с этим запросом :(


CREATE TABLE `category` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL default '',
  `public` int(1) NOT NULL default '0',
  `desc` text NOT NULL,
  `parent` int(11) NOT NULL default '0',
  `subcat` varchar(255) NOT NULL default '0',
  `sort` varchar(255) NOT NULL default '0',
  `hidden` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=47 ;


CREATE TABLE `products` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL default '',
  `created` int(11) NOT NULL default '0',
  `modified` int(11) NOT NULL default '0',
  `id_category` varchar(255) NOT NULL default '',
  `picture` varchar(255) NOT NULL default '',
  `price` varchar(255) NOT NULL default '',
  `valuta` varchar(255) NOT NULL default '',
  `picture_small` varchar(255) NOT NULL default '',
  `old_price` varchar(255) NOT NULL default '',
  `desc_s` text NOT NULL,
  `desc_l` text NOT NULL,
  `public` int(1) NOT NULL default '0',
  `sort` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;

   
 
 автор: Trianon   (31.05.2007 в 09:49)   письмо автору
 
   для: newmen   (31.05.2007 в 02:57)
 

если необходимо определять для каждой категории общее количество входящих в нее подкатегорий(на любых уровнях) - структура Adjacency List (id, parent_id) не подойдет. Лучше опираться на структуру Nested sets (id, left_rb, right_rb, level) либо на Matherialized paths (id, path)

   
 
 автор: newmen   (31.05.2007 в 11:57)   письмо автору
 
   для: Trianon   (31.05.2007 в 09:49)
 

Это не совсем то, что нужно. Нужен обычный sql запрос для объединения двух таблиц. То что требуется получить из этих двух таблиц будет выглядеть приблизительно так.


|----------------|-----------------------|---------------|
| Название       |  Подкатегорий         | Товаров       |
|----------------|-----------------------|---------------|
|   Тест 1       |             2         |       20      |   
|----------------|-----------------------|---------------|
|   Тест 2       |             9         |       10      |   
|----------------|-----------------------|---------------|
|   Тест 3       |             6         |       35      |   
|----------------|-----------------------|---------------|

   
 
 автор: Trianon   (31.05.2007 в 12:36)   письмо автору
 
   для: newmen   (31.05.2007 в 11:57)
 

Мне по-другому сказать?
В рамках выбранной структуры представления дерева и условия неограниченной вложенности его узлов, такой запрос написать невозможно.
Так понятнее?

   
 
 автор: newmen   (31.05.2007 в 17:42)   письмо автору
 
   для: Trianon   (31.05.2007 в 12:36)
 

Мне не нужно все узлы считать... ТОЛЬКО ПОДКАТЕГОРИИ родителя ("SELECT * FROM category WHERE `parent`='$IDParent'") и продуктов только данного родителя.

   
 
 автор: Trianon   (31.05.2007 в 19:01)   письмо автору
 
   для: newmen   (31.05.2007 в 17:42)
 

То есть только непосредственные потомки?
Тогда как-то так:

SELECT cat.name, cats.c_cnt, prods.p_cnt
  LEFT JOIN 
    (SELECT c.id AS c_id, 
        COUNT (s.parent) AS с_cnt
        FROM categories AS c 
          LEFT JOIN categories AS s ON  c.id = s.parent
        GROUP BY c.id ) AS cats
  LEFT JOIN 
    (SELECT c.id AS c_id, 
        COUNT (pr.id_category) AS p_cnt
        FROM categories AS c 
          LEFT JOIN products AS pr ON c.id = prods.id_category
        GROUP BY c.id ) AS prods
  ORDER BY cat.name

   
Rambler's Top100
вверх

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