2013-04-04 3 views
0

У меня есть 2 стола: categories и products.Подкатегории подкатегорий с условием

Категории имеют структуру отношений между родителями и дочерними элементами и данные извлекаются путем присоединения к одной и той же таблице.

При получении данных, я должен рассчитывать:

  1. сколько у продукты каждая категория содержит, которые имеют stock >= 1
  2. сколько у подкатегорий категория содержит, которые содержат, по меньшей мере, 1 продукт с stock >= 1

SELECT c. * , count(DISTINCT s.cat_id) AS number_of_subcategories, count(DISTINCT p.id) AS number_of_products FROM categories c 
LEFT JOIN categories s 
    ON s.parent_id = c.cat_id 
LEFT JOIN products p 
    ON p.cat_id = c.cat_id AND p.stock >= 1 
GROUP BY c.cat_name 
ORDER BY number_of_products ASC 

На первый взгляд все идет хорошо, но, к сожалению, я получаю общее количество подкатегорий.

Я пропустил еще одно соединение или какова моя проблема до сих пор?

Вот код: SQLFiddle

ответ

1

Вы можете изменить ваш запрос, чтобы использовать подзапрос, чтобы получить количество подкатегорий, подобных этим:

SELECT c.cat_id, 
    c.parent_id, 
    c.cat_name, 
    count(sp.cat_id) AS number_of_subcategories, 
    count(DISTINCT p.id) AS number_of_products 
FROM `categories` c 
LEFT JOIN 
(
    select distinct s.cat_id, s.parent_id 
    from categories s 
    inner join products p 
    on s.cat_id = p.cat_id 
    where p.stock > 1 
) sp 
    ON sp.parent_id = c.cat_id 
LEFT JOIN products p 
    ON p.cat_id = c.cat_id 
    AND p.stock >= 1 
GROUP BY c.cat_id, c.parent_id, c.cat_name; 

См сожалению, кажется, не работает SQL Fiddle with Demo

+1

Вау, это на самом деле довольно удивительное решение :) Спасибо! – vikingmaster

0

Попробуйте изменить AND для WHERE. Это работает?

Francisco

+0

. :( – vikingmaster

Смежные вопросы