Выбор категорий, подкатегорий и количества тем в 1 запросе

#php #mysql

#php #mysql

Вопрос:

У меня есть следующий запрос:

 SELECT
        c.frm_category_id,
        c.name,
        c.slug,
        s.frm_category_id,
        s.name,
        s.slug,
        IFNULL(COUNT(t.frm_topic_id),0)
FROM
        frm_categories AS c
LEFT JOIN
        frm_categories AS s
    ON
        c.frm_category_id = s.parent_frm_category_id
LEFT JOIN
        frm_topics AS t
    ON
        s.frm_category_id = t.frm_category_id                       
WHERE
        c.active = 1
    AND
        s.active = 1
ORDER BY
        c.frm_category_id ASC,
        s.frm_category_id ASC
  

Чего я хочу добиться, так это следующего:

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

Этот запрос работает наполовину: он выбирает только категории с подкатегориями и только подкатегории, в которых есть темы.

Может кто-нибудь исправить эту проблему? Или дайте мне полезный совет, чтобы решить эту проблему?

Заранее спасибо!

Ответ №1:

Пропустите логику group by с таблицей frm_topics и лучше поместите фильтр в предложение on вместо предложения where во время внешнего соединения.

 SELECT
        c.frm_category_id,
        c.name,
        c.slug,
        s.frm_category_id sub_cate_id,
        s.name,
        s.slug,
        IFNULL(tpc_count,0)
FROM
        frm_categories AS c
LEFT join 
        frm_categories AS s
    on 
        c.frm_category_id = s.parent_frm_category_id and c.active = 1 and s.active = 1
LEFT JOIN
(select frm_category_id, count(1) tpc_count from 
        frm_topics group by frm_category_id)AS t
    ON
        s.frm_category_id = t.frm_category_id  
  

скрипка sql

Комментарии:

1. Прошу прощения за вопрос, но как я могу это сделать?

2. Это не работает. Активный означает «активна ли категория / подкатегория» да (1) или нет (0). К сожалению, я все еще получаю тот же результат. В любом случае, спасибо за ваши усилия, amow.

3. @yesterday изменил мой ответ, а также добавил sql fiddle.

Ответ №2:

Теперь у меня есть следующий запрос:

 SELECT
            c.frm_category_id,
            c.name,
            c.slug,
            s.frm_category_id,
            s.name,
            s.slug
FROM
            frm_categories AS c
LEFT JOIN(
        SELECT
                frm_category_id,
                parent_frm_category_id,
                name,
                slug
        FROM
                frm_categories
        WHERE
                parent_frm_category_id != 0
) AS s
        ON
            c.frm_category_id = s.parent_frm_category_id            
WHERE
            c.parent_frm_category_id = 0
ORDER BY
            c.frm_category_id ASC
  

Отчасти это работает: теперь я получаю ВСЕ категории, те, У которых ЕСТЬ подкатегории, и те, у которых НЕТ категорий.

Единственное, что я хочу добавить сейчас, это подсчитать все темы в каждой ПОДКАТЕГОРИИ

таблица: темы

frm_topic_ic, frm_category_id, заголовок