Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мультикатегории и подсчёт данных в них 
:(
    Опции темы
Serious2008
Дата 26.3.2012, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Здравствуйте у меня возникла вот такая ситуация. 
Есть допустим продукт, он может быть расположен в множестве категорий. Чтобы сильно не мудрить я решил хранить в записи товара вот так /№ категории/№ другой категории/№ третьей категории/
И вприципе выборка из категории отлично происходит при помощи in ('/id_kat/'). Но вот возникла проблема. Мне нужно посчитать количество товаров в категориях. И категории многоуровневые. Т.е. мне нужно как-то проходиться по всем детям родительской категории и посчитать товары.
Т.е. 
Родительская категория (N) 
 - Ребёнок 1(X)
 ---Ребёнок ребёнка (YX)
 - Ребёнок 2(X2)
 .....
 - Ребёнок N(XN)

И вложенность бесконечная. А Число N должно быть суммой всех ребёноков. И товары могут располагаться только в конечной категории. В скобках число.
PM MAIL   Вверх
skyboy
Дата 26.3.2012, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



в самой категории хранить счетчик "товаров в категории". триггером при измении категории у товара делать перерасчет. единственное нетривиальное место: как в триггере, имея старый и новый списки категорий продукта(/1/5/10/12/ и /1/5/11/12/) найти отличие. после нахождения уже не так сложно будет smile
PM MAIL   Вверх
ksnk
Дата 27.3.2012, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(Serious2008 @  26.3.2012,  23:28 Найти цитируемый пост)
И вприципе выборка из категории отлично происходит при помощи in ('/id_kat/')


Цитата(Serious2008 @  26.3.2012,  23:28 Найти цитируемый пост)
посчитать количество товаров в категориях

Если выборка делается просто, то и посчитать количество результатов выборки тоже просто. Нет?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
baldina
Дата 27.3.2012, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(ksnk @  27.3.2012,  07:58 Найти цитируемый пост)
Если выборка делается просто, то и посчитать количество результатов выборки тоже просто. Нет? 

видимо выборка по одной категории, а подсчет по иерархии
PM MAIL   Вверх
Serious2008
Дата 27.3.2012, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



ksnk, 
Да-да-да именно про иерархичный подсчёт я и говорю.
PM MAIL   Вверх
baldina
Дата 27.3.2012, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



если строка /1/2/3/ означает, что категория 3 входит в категорию 2 и т.д., то для требуемого подсчета нужно знать, кто у данной категории родитель (до самого корня). тогда, например, если нужно подсчитать число товаров в категории 3 и потомках условие запроса будет
Код

LIKE "/1/2/3/%"

а для числа товаров в категории 1
Код

LIKE "/1/%"


Это сообщение отредактировал(а) baldina - 27.3.2012, 10:54
PM MAIL   Вверх
Serious2008
Дата 27.3.2012, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



baldina, 
Нет просто означает в какую категорию входит. Так бы я тоже догадался выбирать по первому из запроса.
PM MAIL   Вверх
baldina
Дата 27.3.2012, 11:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



ну раз так, то
Цитата(Serious2008 @  26.3.2012,  23:28 Найти цитируемый пост)
Чтобы сильно не мудрить

не мудрое решение))
надо мудрить

PM MAIL   Вверх
ksnk
Дата 27.3.2012, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(Serious2008 @  26.3.2012,  23:28 Найти цитируемый пост)
 он может быть расположен в множестве категорий. Чтобы сильно не мудрить я решил хранить в записи товара вот так /№ категории/№ другой категории/№ третьей категории/

Это значит, что товар находится в разных категориях. не связанных друг с другом?

Каким образом задается дерево категорий?



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Serious2008
Дата 27.3.2012, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



ksnk, 
да в разных категориях не завязанных никак между собой, только через 0 она корень.
Дерево через id и parent_id
Т.е. все категории именно вот так. Каждая категория имеет родительского. Те которые корни, они 0. 
Т.е. там может быть допстим так.

Электрооборудование - лобзики
Электрооборудование - инструменты - рабочий инструмент
Рабочий инструмент2 - Инструменты.

И товар может находиться только в каждой конечной.
Т.е. получается в электрооборудовании будет 2 товара типа. в лобзиках 1, в рабочем инструменте 1.
Во втором родителе один товар и в Инструментах 1 тоже.

PM MAIL   Вверх
baldina
Дата 27.3.2012, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 2
Всего: 101



Цитата(Serious2008 @  27.3.2012,  12:38 Найти цитируемый пост)
Дерево через id и parent_id

1. иерархические запросы на sql, специфично для ЯБД. пример для mysql тут
2. если количество товаров не слишком велико, можно загрузить их в массив и обработать на php
PM MAIL   Вверх
Fortop
Дата 27.3.2012, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(Serious2008 @  26.3.2012,  23:28 Найти цитируемый пост)
 Чтобы сильно не мудрить я решил хранить в записи товара вот так /№ категории/№ другой категории/№ третьей категории/

Фиговое решение :( выполните нормализацию искать и считать станет проще.

Т.е. у вас собственно 2 задачи 
- найти все категории внутри родителя.
- посчитать число товаров по этим категориям.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Serious2008
Дата 27.3.2012, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Fortop, 
Предложите лушчий вариант, сказать что фиговое решение любой может.
PM MAIL   Вверх
Fortop
Дата 27.3.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Serious2008, я вам уже предложил.
Храните категории отдельно.
Или nested sets или почитайте это http://demiurg.livejournal.com/53125.html
http://mikehillyer.com/articles/managing-h...-data-in-mysql/

materialized path если очень уж сильно нужен зачем-то - оставьте, но помните что обновлять надо будет в нескольких местах.

Добавлено через 2 минуты и 7 секунд
Ах, да, у вас же даже не MP

тогда тупо нормализуйте БД

Заведите таблицу отношений
Товар-Категория

и делайте выборку по ней.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 27.3.2012, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Итого, для категории X нужно найти все подкатегории и суммировать количество товаров в них.
Все подкатегории категории X вычисляем рекурсивно, чем-то вроде
Код

select id from `categories` where parent=X;

Находя всех чилдов, у каждого чилда - своих чилдов и так далее... Сильно оптимизировать, при такой структуре данных не получится. При желании - список подкатегорий можно хранить в самом узле, пересчитывая его по мере изменения.

Получается список всех чилдов узла.

Запрос, вычисляющий количество товаров в категории - 
Код

select count(*) from `items`where `categories` like '/cat1/' or `categories` like '/cat2/' or ... для всех чилдов.


Надо бы смотреть в сторону nested sets, для хранения дерева категорий. Там задача вычисления чилдов решается в один простой запрос.
Сами категории товара хранить в отдельной таблице. {id товара; id категории}

Хотя сначала надо сделать систему кэширования результатов подсчета, так как эффективная схема хранения данных все равно от этого не спасет.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.