Я пробовал..
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 и т.д. Однако.
Спасибо
Вам необязательно делать все в одном запросе; иногда попытки склеить запросы вместе заканчиваются худшей производительностью (особенно, когда задействованы коррелированные подзапросы). Два запроса в порядке; это когда вы в конечном итоге вызываете новый запрос для каждой строки, у вас есть проблемы.
Итак, вы можете получить предметы категории:
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
могут сделать его менее эффективным. Но я думаю, что в небольшой базе данных вы не заметите.
В любом случае, это будет работать только для двукратного вложения. Если вам нужны суб-подкатегории или деревья с произвольной глубиной в целом, вы должны рассмотреть схему, которая лучше подходит для моделирования деревьев, например, вложенных множеств.