За последние 24 часа нас посетил 18781 программист и 1710 роботов. Сейчас ищут 946 программистов ...

Рекурсивный подсчет количества товаров во вложенных категори

Тема в разделе "PHP и базы данных", создана пользователем sumsum, 9 ноя 2014.

  1. sumsum

    sumsum Новичок

    С нами с:
    13 май 2014
    Сообщения:
    96
    Симпатии:
    0
    Есть таблица каталога товаров

    Код (Text):
    1. CREATE TABLE IF NOT EXISTS `cat` (
    2.   `cat_id` int(4) NOT NULL AUTO_INCREMENT,
    3.   `cat_papa` int(4) DEFAULT NULL,
    4.   `cat_name` varchar(50) COLLATE utf8_bin NOT NULL,
    5.   PRIMARY KEY (`cat_id`)
    6. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    ;

    Есть таблица товаров с привязкой к таблице каталога по tov_cat
    Код (Text):
    1. CREATE TABLE IF NOT EXISTS `tovar` (
    2.   `tov_id` int(10) NOT NULL AUTO_INCREMENT,
    3.   `tov_cat` int(4) NOT NULL,
    4.   `tov_nazv` varchar(100) COLLATE utf8_bin NOT NULL,
    5.   `tov_cena` varchar(100) COLLATE utf8_bin NOT NULL,
    6.   `tov_opis` text COLLATE utf8_bin NOT NULL,
    7.   `tov_kolvo` varchar(40) COLLATE utf8_bin NOT NULL,
    8.   `tov_owner` int(10) DEFAULT '0',
    9.   PRIMARY KEY (`tov_id`)
    10. ) ;
    Хочу вывести все корневые категории (у которых cat_papa=0) и подсчитать количество товаров которые привязаны ко всем вложенным подкатегориям

    Пробую сделать вот так:
    Код (Text):
    1. SELECT cat.cat_id, cat.cat_name, t.count
    2. FROM (
    3. SELECT tov_cat,count(*) count FROM tovar WHERE tov_owner=30 GROUP BY tov_cat
    4. ) t
    5. LEFT JOIN cat cat on cat.cat_id = t.tov_cat
    Получаю результат подсчета но на самом нижнем уровне вложенности, а можно ли средствами MYSQL пройтись по всему циклу и дойти до самого верха? Или только через циклы в php постоянно делая запросы к MySQL?
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Рекурсивный подсчет количества товаров во вложенных кате

    1. (по теме) на nested sets смотрели?
    2. (не по теме) почему цена и кол-во до сих пор строковыми полями
    3. (не по теме) почему все строковые поля сопоставляются как двоичный юникод?
    4. (не по теме) почему идентификаторы категории/родителя указываются как int длиной представления 4 символа?
    5. (не по теме) зачем отрицательные идентификаторы? на практике такое полезно?
     
  3. sumsum

    sumsum Новичок

    С нами с:
    13 май 2014
    Сообщения:
    96
    Симпатии:
    0
    Re: Рекурсивный подсчет количества товаров во вложенных кате

    А без изменения структуры таблицы БД никак не обойтись? Вот так как сейчас есть можно ли сделать какой то запрос что бы вывести названия корневых категорий и количество товаров во всех вложенных категориях. В MySQL вроде есть циклы, но я не силен в них. был бы благодарен за помощь.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Рекурсивный подсчет количества товаров во вложенных кате

    вы пытаетесь делать иерархическую структуру в реляционной субд. вложенные множества реализуют иерархическую структуру и позволяют легко работать со всем деревом. в том числе и самостоятельно отслеживают свою целостность. в случае обычной пары элемент+родитель вам как раз и приходится придумывать извращенные решения по тому как смотреть на дерево вверх/вниз относительно текущей позиции в графе. что для нс было бы тупо поделить уменьшенную на единицу разницу между ключами исследуемого "родителя". впрочем у вас цена и кол-во тектовыми полями. ожидать от вас использования нс наверное слишком... извините за неуместный совет.
     
  5. sumsum

    sumsum Новичок

    С нами с:
    13 май 2014
    Сообщения:
    96
    Симпатии:
    0
    Re: Рекурсивный подсчет количества товаров во вложенных кате

    Я в MySQL не силен, если переходить на nested sets то это затронет много файлов. Мне всего в одном месте надо вывести количество товаров во всех вложенных папках. Возможно ли сделать это на MySQL в принципе для таблиц указанных выше?
    Был бы признателен за пример запроса.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Рекурсивный подсчет количества товаров во вложенных кате

    одним запросом никак. а буквально рекурсивную функцию написать ты наверное и сам сумеешь.
     
  7. sumsum

    sumsum Новичок

    С нами с:
    13 май 2014
    Сообщения:
    96
    Симпатии:
    0
    Re: Рекурсивный подсчет количества товаров во вложенных кате

    Если бы мог написал бы. Меня интересует без изменения структуры таблицы возможно ли сделать то что я хочу? Буду благодарен за помощь.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Рекурсивный подсчет количества товаров во вложенных кате

    Просто добавь еще одно поле - самого первого родителя в категории. Но это костыль.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Рекурсивный подсчет количества товаров во вложенных кате

    возможно. например так: http://stackoverflow.com/a/10994181/272885