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

Тема в разделе "Базы данных", создана пользователем tan_81, 18 мар 2013.

Статус темы:
Закрыта.
Модераторы: latteo
  1. tan_81

    tan_81 Постоялец

    Регистр.:
    18 окт 2006
    Сообщения:
    128
    Симпатии:
    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 - объединяется с объектами, находящимися в категориях
     
  2. p2rcoder

    p2rcoder Постоялец Нарушитель

    Регистр.:
    16 июл 2012
    Сообщения:
    120
    Симпатии:
    29
    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

    както так
     
    tan_81 нравится это.
  3. tan_81

    tan_81 Постоялец

    Регистр.:
    18 окт 2006
    Сообщения:
    128
    Симпатии:
    30
    Спасибо за попытку, значительно ближе, но суть в том, что сейчас мы получили суммы по всем категориям, а надо получить только суммы для верхнего уровня со всеми их "детьми" (почему-то этого в описании не написал, наверное рассчитывал, что понятно из кода).
     
  4. p2rcoder

    p2rcoder Постоялец Нарушитель

    Регистр.:
    16 июл 2012
    Сообщения:
    120
    Симпатии:
    29
    тогда так

    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 то в предпоследний мой запрос нужно просто на конце дописать where rc.root_id = 5, а так там эта таблица в связях есть

    пс. набил сообщений, можно идти спать )
     
    tan_81 нравится это.
Статус темы:
Закрыта.