#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
Комментарии:
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, заголовок