@IceJOKER
Web/Android developer

Как правильно связать таблицы?

Здравствуйте.
Есть 3 таблицы:
cats: id | parent_id | title | NSLeft | NSRight | NSLevel
items: id | category_id
cats_bind: item_id | cat_id

в items.category_id хранится ID основной категории, а в cats_bind хранятся дополнительные категории(т.е. подкатегории). Основная категория обязательна, а доп. категории - НЕТ

1. Нужно вывести все элементы категорий(или определенной категории) рекурсивно
2. Нужно вывести количество всех элементов рекурсивно
Если продублировать id основной категории в cats_bind, то со связями и запросом проблем нет, но нужно хранить отдельно основную категорию и отдельно доп. категории.
Пытался связать таблицы разными путями, но не получилось, получал либо элементы у которых есть доп. категории, либо наоборот ...... самооценка уже ниже плинтуса, выручайте )
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT DISTINCT `t`.`id`, `i`.`id` 
    FROM `cats` AS `c`
    JOIN `cats` AS `t` ON `t`.`NSLeft` >= `c`.`NSLeft` 
                       AND `t`.`NSRight` <= `c`.`NSRight`
    LEFT JOIN `cats_bind` AS `cb` ON `cb`.`cat_id` = `t`.`id`
    LEFT JOIN `items` AS `i` ON `i`.`category_id` = `t`.`id` 
                             OR `i`.`id` = `cb`.`item_id`
    WHERE `c`.`id` = :root_category
    ORDER BY `t`.`title`, `i`.`title`
Ответ написан
Комментировать
chlp
@chlp
фулстек
Допустим, SELECT_CATS – запрос для получения id всех подкатегорий рекурсивно.

SELECT * FROM items WHERE category_id IN (SELECT_CATS)
UNION
SELECT * FROM items WHERE item_id = (SELECT item_id FROM cats_bind WHERE cat_id IN (SELECT_CATS))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы