За последние 24 часа нас посетили 22923 программиста и 1216 роботов. Сейчас ищут 667 программистов ...

Как подсчитать количество товаров в категории?

Тема в разделе "MySQL", создана пользователем mr.forumman, 22 окт 2018.

Метки:
  1. mr.forumman

    mr.forumman Новичок

    С нами с:
    26 ноя 2017
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте. Помогите составить SQL запрос. Мне нужно подсчитать количество товаров в категории. Насколько я понял мне нужен LEFT or RIGT JOIN, но я не разобрался как это всё связать и получить данные.

    Таблица меню (они же и категории)
    Код (Text):
    1.  
    2. CREATE TABLE `main_menu` (  
    3. `id` int(11) NOT NULL,  
    4. `title` varchar(255) NOT NULL,  
    5.  `parent` int(11) NOT NULL,  
    6. `alias` varchar(255) NOT NULL
    7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Содержимое таблицы главного меню:
    Код (Text):
    1. INSERT INTO `main_menu` (`id`, `title`, `parent`, `alias`) VALUES
    2. (1, 'Мужское', 0, 'mens'),
    3. (2, 'Женское', 0, 'woomens'),
    4. (3, 'Детское', 0, 'childrens'),
    5. (4, 'Рубашки', 1, 'rubashki'),
    6. (5, 'Брюки', 1, 'bruki'),
    7. (6, 'Футболки', 1, 'footbolki'),
    8. (7, 'Топик', 2, 'topik'),
    9. (8, 'Юбка', 2, 'ubka'),
    10. (9, 'Джинсы', 3, 'jeans'),
    11. (10, 'Кепки', 3, 'heats');
    Таблица с продуктами:
    Код (Text):
    1. CREATE TABLE `products` (
    2.   `id` int(11) NOT NULL,
    3.   `img` varchar(255) NOT NULL,
    4.   `title` varchar(255) NOT NULL,
    5.   `descr` text NOT NULL,
    6.   `full_text` text NOT NULL,
    7.   `category` int(11) NOT NULL,
    8.   `status` int(11) NOT NULL,
    9.   `price` int(11) NOT NULL,
    10.   `code` int(11) NOT NULL
    11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Содержимое таблицы продуктов:
    Код (Text):
    1. INSERT INTO `products` (`id`, `img`, `title`, `descr`, `full_text`, `category`, `status`, `price`) VALUES
    2. (8, '', 'Заголовок', 'Краткое описание', 'полное описание', 2, 1, 0),
    3. (9, '','Заголовок', 'Краткое описание', 'полное описание', 5, 1, 0),
    4. (10, '','Заголовок', 'Краткое описание', 'полное описание', 3, 1, 0);
    Здесь в столбце `category` int(11) NOT NULL, записывается или же храниться id категории из таблицы выше(`main_menu` `id` int(11)).

    Я связал столбцы
    Код (Text):
    1. ALTER TABLE `products`
    2.   ADD CONSTRAINT `products_ibfk_1` FOREIGN KEY (`category`) REFERENCES `main_menu` (`id`);
    3. COMMIT;
    Связал кажется правильно(но не уверен), а вот составить sql запрос у меня не получилось.
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @mr.forumman, просто добавь в таблицу категорий поле с количеством товаров в категориях которое будет обновляться по триггеру например.
     
  3. mr.forumman

    mr.forumman Новичок

    С нами с:
    26 ноя 2017
    Сообщения:
    4
    Симпатии:
    0
    Зачем этот мусор в таблице с категориями?
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Непосредственно для подсчета кол-ва LEFT JOIN не требуется, если имеется только один уровень категорий или выполняется подсчет в категории, к кот. непосредственно относятся продукты.
    --- Добавлено ---
    Это не мусор, а оч. полезная оптимизация.
    --- Добавлено ---
    Вот гляньте код для вашего случая: http://gency.ru/g-drive-blog
    Немного посложнее: http://gency.ru/filter-items-by-level-of-hierarchy
     
    mr.forumman нравится это.
  5. mr.forumman

    mr.forumman Новичок

    С нами с:
    26 ноя 2017
    Сообщения:
    4
    Симпатии:
    0
    Категории многоуровневые, но на данный момент всего 2-а уровня. Так как же мне получить количество товаров в категории? В какую сторону рыть?
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    См. выше. Кэширование кол-в в категориях делается, чтобы не выполнять каждый раз доп. запрос с COUNT().
    --- Добавлено ---
    Да, для двух уровней может потребоваться присоединение, если нужно подсчитать кол-во продуктов в категориях верхнего уровня (разделах).
    --- Добавлено ---
    Потому что в условии отбора нужно использовать идентификаторы категорий, которых нет непосредственно в записях продуктов.
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    это не мусор, а обоснованная денормализация, потому как деревья это нечто противоестественное для реляционной БД
    другой вариант nested sets но боюсь ты его невкуришь, если у тебя даже тут запары
    ну и третий вариант (для людей использующих его отдельное место в аду) запросы в цикле
     
    Dmitriy A. Arteshuk и mr.forumman нравится это.
  8. mr.forumman

    mr.forumman Новичок

    С нами с:
    26 ноя 2017
    Сообщения:
    4
    Симпатии:
    0
    Вопрос решен!