SQL-запрос для выбора из таблицы с категориями и подкатегориями - PullRequest
0 голосов
/ 12 июня 2018

Структура таблицы категорий:

  • id
  • title
  • parent_id

Структура таблицы элементов:

  • id
  • title
  • is_active (0 или 1)
  • category_id

структура таблицы

Таблицы связаны с полем category_id отношением один ко многим.Те.В одной категории может быть много элементов.

Двухуровневая иерархия в таблице категорий.Это определяет основные категории и подкатегории.Категории - это те записи, в которых parent_id = NULL.И подкатегории, это те записи, в которых parent_id = некоторому идентификатору.

Один элемент может принадлежать как к основной категории (где parent_id = null), так и к подкатегории (child).Элемент может быть активным, а не активным (0 или 1).

Вам необходимо выполнить запрос и выбрать из таблицы категорий все основные категории (которые имеют parent_id = null), которые имеют активные элементы (is_active = 1).) и которые имеют подкатегории также с активными итемами.т.е. если у дочерней подкатегории есть элементы с is_active = 0, то не отображать эту категорию.

Я мог бы выбрать только основные категории, в которых только активные элементы:

SELECT categories.title, count(analyses.id) FROM items
            INNER JOIN categories on items.category_id = categories.id
            WHERE categories.parent_id IS NULL
            AND categories.is_active = 1
            GROUP BY analyses.category_id
            ORDER BY analyses_categories.title

Но с подкатегориямине могу больше справляться, подскажите пожалуйста, у кого больше опыта.

1 Ответ

0 голосов
/ 12 июня 2018

Немного неясно, что вы пытаетесь count (только активные элементы, связанные с родителем?), Но я бы использовал exists, чтобы узнать, у кого также есть дети с активными элементами:

select c.title, count(*)
from categories c
    join item i on i.category_id = c.id 
where c.parent_id is null and i.is_active = 1 and exists (
    select 1
    from categories c2
        join item i on c2.id = i.category_id
    where c2.parent_id = c.id and i.is_active = 1
)
group by c.title
...