Как получить количество элементов в категориях верхнего уровня и включение элементов в непосредственные подкатегории с помощью запроса MySQL

0

Я пробовал..

SELECT  c.* , (
    SELECT COUNT( * )
    FROM item t
    WHERE t.cat_id = c.cat_id
    )ct_items, (

    SELECT COUNT( * )
    FROM item t
    INNER JOIN cat c3 ON t.cat_id = c3.cat_id
    AND c3.cat_id = c.parent_id
    ) ct_sub
FROM cat c
WHERE parent_id = '0'
ORDER BY name

но в столбце "on" указан Неизвестный столбец "c.parent_id". Любые идеи, почему я получаю этот или другой способ достичь этого с помощью запроса mysql? Я могу работать с числами, используя несколько запросов и используя php и т.д. Однако.

Спасибо

Теги:

1 ответ

1
Лучший ответ

Вам необязательно делать все в одном запросе; иногда попытки склеить запросы вместе заканчиваются худшей производительностью (особенно, когда задействованы коррелированные подзапросы). Два запроса в порядке; это когда вы в конечном итоге вызываете новый запрос для каждой строки, у вас есть проблемы.

Итак, вы можете получить предметы категории:

SELECT c0.*, COUNT(i0.id) AS cat_nitems
FROM cat AS c0
LEFT JOIN item AS i0 ON i0.cat_id=c0.cat_id
WHERE c0.parent_id= '0'
GROUP BY c0.cat_id
ORDER BY c0.name

а затем отдельно получить элементы подкатегории, используя самосоединение parent-child:

SELECT c0.*, COUNT(i1.id) AS subcats_nitems
FROM cat AS c0
LEFT JOIN cat AS c1 ON c1.parent_id=c0.cat_id
LEFT JOIN item AS i1 ON item.cat_id=c1.cat_id
WHERE c0.parent_id= '0'
GROUP BY c0.cat_id
ORDER BY c0.name

И да, вы можете объединить их в один запрос:

SELECT c0.*, COUNT(DISTINCT i0.id) AS cat_nitems, COUNT(DISTINCT i1.id) AS subcats_nitems
FROM cat AS c0
LEFT JOIN cat AS c1 ON c1.parent_id=c0.cat_id
LEFT JOIN item AS i0 ON item.cat_id=c0.cat_id
LEFT JOIN item AS i1 ON item.cat_id=c1.cat_id
WHERE c0.parent_id= '0'
GROUP BY c0.cat_id
ORDER BY c0.name

Я бы заподозрил, что большее объединение и DISTINCT могут сделать его менее эффективным. Но я думаю, что в небольшой базе данных вы не заметите.

В любом случае, это будет работать только для двукратного вложения. Если вам нужны суб-подкатегории или деревья с произвольной глубиной в целом, вы должны рассмотреть схему, которая лучше подходит для моделирования деревьев, например, вложенных множеств.

  • 0
    Эта ссылка может помочь: Управление иерархическими данными в MySQL: dev.mysql.com/tech-resources/articles/hierarchical-data.html
  • 0
    спасибо .. Я понимаю, что все не должно быть в одном запросе, но задавался вопросом, почему это не сработало. Мне это нужно только для вложенности с двумя глубинами, поэтому не интересуются вложенными множествами. Спасибо за вышеупомянутый запрос, у меня есть игра с этим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню