Подсчет товаров в каталоге через БД

funkster

Новичок
Подсчет товаров в каталоге через БД

Здравствуйте,
такая вот проблемка возникла.

структура таблицы Товаров
ID NAME CATALOGID

структура таблицы Каталогов
ID NAME PARENTID

Как с помощью средств MySQL выгрузить информацию по каталогу верхнего уровня, для которого PARENTID=0 в следующем виде
Название - количество товара в нем и во всех дочерных каталогах ?
Всего 3 уровня вложенности в каталоге.

Что-то я запутался совсем.
 

Bitterman

Новичок
При трех уровнях вложенности юзать LEFT JOIN. Если число уровней неограничено - смотреть теорию деревьев (раздел Вопрос-Ответ)
 

funkster

Новичок
Пронеограничено - надо выбирать рекурсивно ...
Я единственное, что придумал, так это LEFT JOIN on parentid и выбирать count(tovary1.id), count(tovary2.id), count(tovary3.id)

Но тогда в 3х столбцах будет сумма товаров по отдельным категориям и на выходе прийдется анализировать есть ли запись в столбце итд.
Мне интересно, возможно ли в одном запросе получить итоговые цифры
 

Bitterman

Новичок
[sql]
SELECT c.ID, COUNT(DISTINCT t.ID)
FROM Catalog as c
LEFT JOIN Catalog as c1 ON c1.ParentID=c.ID
LEFT JOIN Tovar as t ON t.CatalogID=c.ID OR t.CatalogID=c1.ID
WHERE c.ParentID=0
GROUP BY c.ID
[/sql]
Писал "на коленке", проверять лень, да и времени особо нет. Если сработает, то для 3 уровней вложенности думаю допишешь сам.

P.S. А по какой причине вопрос по чистому MySQL оказался в разделе по PHP?
 

funkster

Новичок
Честно говоря, хотел сначала узнать как рекурсию лучше организовать, потом разобрался...
а форум поменять для вопрос забыл =(

Виноват ...
 

funkster

Новичок
Виснет запрос, походу из-за
t.CatalogID = c.ID OR t.CatalogID = c1.ID

-~{}~ 28.03.07 17:39:

SELECT c.ID, (COUNT( DISTINCT t.ID )+COUNT( DISTINCT t2.ID ) )
FROM catalog AS c
LEFT JOIN catalog c1 ON c1.Parentcatalog = c.ID
LEFT JOIN tovary t on t.CatalogID = c.ID
LEFT JOIN tovary t2 on t2.CatalogID = c1.ID
WHERE c.Parentcatalog = 0
GROUP BY c.ID

Хм, походу есть смысл так попробовать ...
 

Bitterman

Новичок
Виснет запрос, походу из-за
t.CatalogID = c.ID OR t.CatalogID = c1.ID
Странно, что в этом такого? Этот кусок, кстати, можно заменить на конструкцию t.CatalogID IN (c.ID, c1.ID,...)
Проверил у себя, ничего не виснет, запрос работает как надо. Объем данных, конечно, крайне незначителен. Так что попробуй проверить еще раз.
 

serglt

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

funkster

Новичок
serglt,
Там пока регулярно скрипт перекраивается, поэтому проще пока считать сразу.
Я согласен, что твой вариант упростит дело, так и было реализовано, но пока к сожалению нет возможности вернуться к такому методу.

Тут еще больше гемор посчитать сколько фирм разместило товары в каждой родительской категории ...
 
Сверху