помогите написать сложный SQL-запрос

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Закрыто
Sobit
Сообщения: 34
Зарегистрирован: 2010.12.02, 23:57

помогите написать сложный SQL-запрос

Сообщение Sobit »

итак, дано:

tbl_categories

Код: Выделить всё

 id | pid | title
----+-----+-------
    |     | 
id - id категории
pid - id надкатегории
title - название категории
двухуровневая структура, у первого уровня pid = 0

tbl_products

Код: Выделить всё

 id | category_id | title
----+-------------+-------
    |             | 
id - id продукта
category_id - id категории
title - название продукта
остальное неважно
привязка по категориям может идти как к первому уровню категорий, так и ко второму

задача:

построить sql-запрос, чтобы выводил следующую таблицу

tbl_result

Код: Выделить всё

 id | pid | title | products_count
----+-----+-------+----------------
    |     |       | 
id - id категории
pid - id надкатегории
title - название категории
products_count - количество продуктов, относящихся к этой категории

примечание: products_count должен подсчитывать продукты, которые непосредственно принадлежат этой категории, плюс (если категория на первом уровне) прибавить сумму продуктов подкатегорий

заранее благодарю,
сделайте кто-нибудь, но только тогда, когда реально нечем заняться будет... не стоит отвлекаться от работы ;)
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: помогите написать сложный SQL-запрос

Сообщение pirrat »

ну можно как то так извратиться

Код: Выделить всё

SELECT *, (SELECT COUNT(*) FROM product WHERE category_id IN (SELECT id FROM  category c2 WHERE c2.pid=c.id OR c2.id=c.id)) as  product_count FROM category c
в запросе название таблиц и полей свое - переделайте на ваши.

смысл: выбираем все категории ,для каждой из них выбираем кол-во продуктов, которые принадлежат текущей категории, и категориям у которых pid=id текущей категории.

но это токо для 2ух уровней, для больше лучше nested sets заюзать - там это порядком проще с любым кол-вом уровней.

думаю, что можно что нибудь получше придумать, но не охото заморачиваться сейчас)

а вообще в вашем конкретном случае, лучше добавить поле product_count  в таблицу категорий, и пересчитывать его при добавление/удаление продуктов.
Sobit
Сообщения: 34
Зарегистрирован: 2010.12.02, 23:57

Re: помогите написать сложный SQL-запрос

Сообщение Sobit »

ну так зачем же заморачиваться? все прекрасно работает :)

спасибо вам огромное!!!

выкладываю отредактированный рабочий код:

Код: Выделить всё

SELECT *, (
  SELECT COUNT(*) 
  FROM   `tbl_products`
  WHERE  `category_id` IN (
    SELECT `id`
    FROM   `tbl_categories` AS `c2`
    WHERE  `c2`.`pid` = `c`.`id`
    OR     `c2`.`id`  = `c`.`id`
  )
) AS `products_count`
FROM `tbl_categories` AS `c` 
надеюсь кому-нибудь понадобится :)
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: помогите написать сложный SQL-запрос

Сообщение pirrat »

заморочиться, всмысле придумать - чтобы делать выборку для не ограниченного (или большего) числа уровней.

рад, что помог.
Закрыто