2013-09-23 5 views
0

Я застрял в запросе на подсчет.SQL - подсчет по рекурсивной категории

У меня есть 3 таблицы:

Articoli 
ID | Title | ecc... 

Categories 
ID | Name | Parent 

articles_category 
category_id | article_id 

Категория являются рекурсивной, например, у меня есть основная категория «Новости» с 3 югом кошкой.

Мне нужно подсчитать, сколько статей находится в «Новостях», но моя статья помечена в таблице «articles_category» с идентификатором subcat (если есть SubCat) или с основным идентификатором Cat, если у него нет подката , До сих пор я пытался:

SELECT count(a.id), child.name AS child, parent.name AS parent 
FROM categories parent 
JOIN categories child ON child.parent = parent.tid 
JOIN categories_articoli ca ON child.tid = ca.category_id 
    OR parent.tid = ca.category_id 
JOIN articoli a ON a.id = ca.articolo_id 
GROUP BY parent.tid 

Но это вернуть мне только родительский кот, которые имеют подкатегорию, но это каждый раз верно. Любое предложение?

ответ

1

Вам необходимо использовать таблицу категорий recursive sql.

Попробуйте это:

Count (*) статей в Новости категории:

with category_tree(id) as 
(select c.id 
    from Categories c 
    where c.name='News'--category tree starting with 'News' 
    union all 
    select c.id 
    from category_tree ct 
    inner join Categories c 
     on c.parent = ct.id) 
select count(distinct ac.article_id) from category_tree ct 
inner join articles_category ac on ac.category_id = ct.id 

Count (*) статей по категориям:

with category_tree(id, root_category_name) as 
(select c.id, c.name 
    from Categories c 
    where c.parent is null 
    union all 
    select c.id, ct.root_category_name 
    from category_tree ct 
    inner join Categories c 
     on c.parent = ct.id) 
select ct.root_category_name, count(distinct ac.article_id) from category_tree ct 
inner join articles_category ac on ac.category_id = ct.id 
group by ct.root_category_name 

http://sqlfiddle.com/#!4/d42aa/12

0

Спасибо много!

Невезучий я не могу использовать «С» заявление в MySQL (жаль, что я не указать это), но я решить мою проблему таким образом:

  • создать набор данных в Wich каждый идентификатор связанные с его именем parent_category
  • присоединяйтесь к нему на category_articoli table
  • group by parent_category name.

Вот запрос, если кто-то может понадобиться что-то вроде этого:

SELECT count(distinct ca.articolo_id), cat.name 
FROM categories_articoli ca 
JOIN(
    SELECT c.tid AS ID, c.name AS name, c.parent 
    FROM categories c 
    WHERE c.parent = 0 AND c.tid <> 6 
    UNION 
    SELECT c.tid AS ID, parent.name AS name, c.parent 
    FROM categories c 
    JOIN categories parent ON c.parent = parent.tid 
    WHERE c.parent <> 0 AND c.tid <> 10 
) cat 
ON cat.ID = ca.category_id 
GROUP BY cat.name 
-2

я думаю, что это неправильно, becouse ваше решение Dont писать «верхние» категории (ФЭ .: у вас есть кошка номер 3 в 2 в 1 и предметы только в категории 3 - ваше решение вернет правильное количество предметов в категориях 3 и 2, но категория 1 не будет в результате, и она должна быть там)

+0

Этот ответ непонятен – Machavity

+0

Это не отвечает вопрос. – Elyasin

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