Здравствуйте. Помогите составить SQL запрос. Мне нужно подсчитать количество товаров в категории. Насколько я понял мне нужен LEFT or RIGT JOIN, но я не разобрался как это всё связать и получить данные. Таблица меню (они же и категории) Код (Text): CREATE TABLE `main_menu` ( `id` int(11) NOT NULL, `title` varchar(255) NOT NULL, `parent` int(11) NOT NULL, `alias` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Содержимое таблицы главного меню: Код (Text): INSERT INTO `main_menu` (`id`, `title`, `parent`, `alias`) VALUES (1, 'Мужское', 0, 'mens'), (2, 'Женское', 0, 'woomens'), (3, 'Детское', 0, 'childrens'), (4, 'Рубашки', 1, 'rubashki'), (5, 'Брюки', 1, 'bruki'), (6, 'Футболки', 1, 'footbolki'), (7, 'Топик', 2, 'topik'), (8, 'Юбка', 2, 'ubka'), (9, 'Джинсы', 3, 'jeans'), (10, 'Кепки', 3, 'heats'); Таблица с продуктами: Код (Text): CREATE TABLE `products` ( `id` int(11) NOT NULL, `img` varchar(255) NOT NULL, `title` varchar(255) NOT NULL, `descr` text NOT NULL, `full_text` text NOT NULL, `category` int(11) NOT NULL, `status` int(11) NOT NULL, `price` int(11) NOT NULL, `code` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Содержимое таблицы продуктов: Код (Text): INSERT INTO `products` (`id`, `img`, `title`, `descr`, `full_text`, `category`, `status`, `price`) VALUES (8, '', 'Заголовок', 'Краткое описание', 'полное описание', 2, 1, 0), (9, '','Заголовок', 'Краткое описание', 'полное описание', 5, 1, 0), (10, '','Заголовок', 'Краткое описание', 'полное описание', 3, 1, 0); Здесь в столбце `category` int(11) NOT NULL, записывается или же храниться id категории из таблицы выше(`main_menu` `id` int(11)). Я связал столбцы Код (Text): ALTER TABLE `products` ADD CONSTRAINT `products_ibfk_1` FOREIGN KEY (`category`) REFERENCES `main_menu` (`id`); COMMIT; Связал кажется правильно(но не уверен), а вот составить sql запрос у меня не получилось.
@mr.forumman, просто добавь в таблицу категорий поле с количеством товаров в категориях которое будет обновляться по триггеру например.
Непосредственно для подсчета кол-ва LEFT JOIN не требуется, если имеется только один уровень категорий или выполняется подсчет в категории, к кот. непосредственно относятся продукты. --- Добавлено --- Это не мусор, а оч. полезная оптимизация. --- Добавлено --- Вот гляньте код для вашего случая: http://gency.ru/g-drive-blog Немного посложнее: http://gency.ru/filter-items-by-level-of-hierarchy
Категории многоуровневые, но на данный момент всего 2-а уровня. Так как же мне получить количество товаров в категории? В какую сторону рыть?
См. выше. Кэширование кол-в в категориях делается, чтобы не выполнять каждый раз доп. запрос с COUNT(). --- Добавлено --- Да, для двух уровней может потребоваться присоединение, если нужно подсчитать кол-во продуктов в категориях верхнего уровня (разделах). --- Добавлено --- Потому что в условии отбора нужно использовать идентификаторы категорий, которых нет непосредственно в записях продуктов.
это не мусор, а обоснованная денормализация, потому как деревья это нечто противоестественное для реляционной БД другой вариант nested sets но боюсь ты его невкуришь, если у тебя даже тут запары ну и третий вариант (для людей использующих его отдельное место в аду) запросы в цикле