Помогите с запросом подсчета количества объектов в категориях

Статус
В этой теме нельзя размещать новые ответы.

tan_81

Постоялец
Регистрация
18 Окт 2006
Сообщения
129
Реакции
30
Здравствуйте,

Помогите pls с запросом подсчета количества объектов в категориях
Есть 2-х уровневое дерево категорий. Объект может относиться к множеству категорий. Если у категории есть подкатегории, то объект не может быть привязан к категории.

1. Справочник категорий с иерархией до 2 уровня
ref_cat
id (int)
title (var)
root_id (int) (все категории имеют родителя = 5, подкатегории id родителя)
level (int)
sort (int)

2. Таблица хранения связей
ref_cat_cli
category_id (int)
task_id (int)

2. Упрощенный вариант объекта
r_user_client
id (int)

Создал запрос выборки, но не пойму как получить количество объектов в каждой категории в 1 запрос (count начинает ругаться от таких сопоставлений)

Код:
select title,id from
 
(
    select ref_cat.title, ref_cat.id from ref_cat where ref_cat.id IN (select ref_cat.root_id from ref_cat, r_user_client, ref_cat_cli where ref_cat.root_id!=5 and ref_cat.id = ref_cat_cli.category_id and ref_cat_cli.task_id = r_user_client.id group by ref_cat.root_id)
    union
    select ref_cat.title, ref_cat.id from ref_cat, r_user_client, ref_cat_cli where ref_cat.root_id=5 and ref_cat.id = ref_cat_cli.category_id and ref_cat_cli.task_id = r_user_client.id group by ref_cat.title, ref_cat.id
)
 
group by title, id
order by title

Запрос состоит из 2 частей: 1 - выбирает все объекты из подкатегорий (ref_cat.root_id!=5)
2 - объединяется с объектами, находящимися в категориях
 
select rc.title, rc.id, (select count(rcc.ref_cat_item) from ref_cat_cli rcc where rc.id = rcc.category_id) from ref_cat rc

Не, ну может быть у меня конечно голова сейчас совсем не варит, но оно никак не может работать по определению (не говоря о правильности). Посты набиваем?

да похоже я тоже писал когда голова не варила, но сейчас вижу что не правильно

select rc.title, rc.id, (select count(distinct ruc.id) from ref_cat_cli rcc, r_user_client ruc where rcc.task_id = ruc.id
and ((rcc.category_id = rc.id) or rcc.category_id in (select rc2.id from ref_cat rc2 where rc2.root_id = rc.id))) from ref_cat rc

както так
 
да похоже я тоже писал когда голова не варила, но сейчас вижу что не правильно

select rc.title, rc.id, (select count(distinct ruc.id) from ref_cat_cli rcc, r_user_client ruc where rcc.task_id = ruc.id
and ((rcc.category_id = rc.id) or rcc.category_id in (select rc2.id from ref_cat rc2 where rc2.root_id = rc.id))) from ref_cat rc

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

select rc.title, rc.id, (select count(distinct rcc.task_id) from ref_cat_cli rcc where (rcc.category_id = rc.id) or rcc.category_id in (select rc2.id from ref_cat rc2 where rc2.root_id = rc.id)) from ref_cat rc where rc.root_id = 5

Во, работает, спасибо!
С утра со свежей головой подумаю как сюда r_user_client вкрутить (там просто права доступа зарыты на объекты и считать надо с учетом них) и избавиться от результатов для Root (id=5) (есть категории 2 уровня без подкатегорий и их объекты попадают к Root id=5)

если нужно использовать r_user_client то в предпоследний мой запрос нужно просто на конце дописать where rc.root_id = 5, а так там эта таблица в связях есть

пс. набил сообщений, можно идти спать )
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху