SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.01.2015 10:19:34

saylar_06
Участник
Зарегистрирован: 01.09.2014
Сообщений: 13

Подскажите с запросом, три запроса в одном?

Вывод всех категорий с подсчетом количества записей у каждой
Здравствуйте, пожалуйста подскажите как вывести категории и подкатегории с кол-ом записей.
если есть запись то выводить кол-во если нету то 0 или еще что.


--
-- Структура таблицы `shop_catalogParent`
--

CREATE TABLE IF NOT EXISTS `shop_catalogParent` (
  `catalog_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `catalog_name` varchar(80) NOT NULL,
  `catalog_position` tinyint(2) unsigned NOT NULL DEFAULT '0',
  `catalog_visible` tinyint(1) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`catalog_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

--
-- Дамп данных таблицы `shop_catalogParent`
--

INSERT INTO `shop_catalogParent` (`catalog_id`, `catalog_name`, `catalog_position`, `catalog_visible`) VALUES
(1, 'Игрушки', 1, 1),
(2, 'Телефоны', 2, 1),
(3, 'Ноутбуки', 3, 1),
(4, 'Мебель', 4, 0);

--
-- Структура таблицы `shop_catalogSub`
--

CREATE TABLE IF NOT EXISTS `kupibon_catalogSub` (
  `sub_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `sub_name` varchar(80) NOT NULL,
  `parent_catalog` tinyint(3) unsigned NOT NULL,
  `sub_position` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `sub_visible` tinyint(1) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`sub_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=46 ;

--
-- Дамп данных таблицы `shop_catalogSub`
--

INSERT INTO `shop_catalogSub` (`sub_id`, `sub_name`, `parent_catalog`, `sub_position`, `sub_visible`) VALUES
(1, 'Куклы', 1, 1, 1),
(2, 'Машины', 1, 2, 1),
(3, 'Iphone', 2, 1, 1),
(4, 'Apple', 3, 1, 1),
(5, 'Диваны', 4, 1, 1);

--
-- Структура таблицы `shop_catalogProducts`
--

CREATE TABLE IF NOT EXISTS `shop_catalogProducts` (
  `product_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_title` varchar(255) NOT NULL,
  `product_keywords` varchar(255) NOT NULL,
  `product_description` varchar(255) NOT NULL,
  `product_img` varchar(255) NOT NULL DEFAULT 'no_image.jpg',
  `product_imgSlide` varchar(255) NOT NULL DEFAULT 'no_image.jpg',
  `product_parent` tinyint(3) unsigned NOT NULL,
  `product_content` text NOT NULL,
  `product_visible` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `product_hit` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `product_hot` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `product_new` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `product_onTop` tinyint(1) NOT NULL DEFAULT '2',
  `product_price` int(7) NOT NULL DEFAULT '0',
  `product_fullPrice` int(7) NOT NULL DEFAULT '0',
  `product_discount` int(3) NOT NULL DEFAULT '0',
  `product_forSale` int(10) NOT NULL DEFAULT '0',
  `product_endTime` int(10) NOT NULL DEFAULT '0',
  `product_beginPeriod` int(10) NOT NULL DEFAULT '0',
  `product_endPeriod` int(10) NOT NULL DEFAULT '0',
  `product_onMap` int(1) NOT NULL DEFAULT '0',
  `product_companyName` varchar(255) NOT NULL,
  `product_companyUrl` varchar(255) NOT NULL,
  `product_companyPhone` varchar(255) NOT NULL,
  `product_companyAddress` varchar(255) NOT NULL,
  `product_companyDescription` text NOT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Дамп данных таблицы `shop_catalogProducts`
--

INSERT INTO `shop_catalogProducts` (`product_id`, `product_title`, `product_keywords`, `product_description`, `product_img`, `product_imgSlide`, `product_parent`, `product_content`, `product_visible`, `product_hit`, `product_hot`, `product_new`, `product_onTop`, `product_price`, `product_fullPrice`, `product_discount`, `product_forSale`, `product_endTime`, `product_beginPeriod`, `product_endPeriod`, `product_onMap`, `product_companyName`, `product_companyUrl`, `product_companyPhone`, `product_companyAddress`, `product_companyDescription`) VALUES
(1, 'Товар 1', '', '', 'no_image.jpg', 'no_image.jpg', 2, '', 1, 1, 0, 0, 2, 990, 14000, 53, 0, 0, 0, 0, 0, '', '', '', '', ''),
(2, 'Товар 2', '', '', 'no_image.jpg', 'no_image.jpg', 2, '', 1, 1, 0, 0, 2, 990, 14000, 53, 0, 0, 0, 0, 0, '', '', '', '', ''),
(3, 'Товар 3', '', '', 'no_image.jpg', 'no_image.jpg', 3, '', 1, 0, 0, 0, 2, 390, 16500, 72, 0, 0, 0, 0, 0, '', '', '', '', '');

есть вот такой вот запрос:

SELECT * FROM shop_catalogSub
                INNER JOIN shop_catalogParent ON
                    shop_catalogSub.parent_catalog = shop_catalogParent.catalog_id
                    WHERE
                        shop_catalogParent.catalog_visible = 1 AND shop_catalogSub.sub_visible = 1
                        ORDER BY catalog_position, sub_position

все с учетом видимости каталогов и их позиции я получаю

 


нужно еще получить в запросе кол-во записей если имеются записи
shop_catalogParent - хранит в себе родительские категории(только категории, записей нет)
shop_catalogSub - хранит в себе подкатегории shop_catalogParent
shop_catalogProducts - хранит в себе товары из подкатегорий shop_catalogSub

Неактивен

 

#2 22.01.2015 10:55:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подскажите с запросом, три запроса в одном?

Если `product_parent` это номер подкатегорий из shop_catalogSub, то

SELECT shop_catalogSub.*, shop_catalogParent.*, count(*) FROM (shop_catalogSub
                INNER JOIN shop_catalogParent ON
                    shop_catalogSub.parent_catalog = shop_catalogParent.catalog_id)
left JOIN shop_catalogProducts ON
                    shop_catalogSub.sub_id = shop_catalogProducts.product_parent
                    WHERE
                        shop_catalogParent.catalog_visible = 1 AND shop_catalogSub.sub_visible = 1
 group by shop_catalogSub.sub_id
                        ORDER BY catalog_position, sub_position;


И обратите внимание на статью про группировку

Неактивен

 

#3 22.01.2015 11:30:47

saylar_06
Участник
Зарегистрирован: 01.09.2014
Сообщений: 13

Re: Подскажите с запросом, три запроса в одном?

Спасибо Вам за Вашу помощь! Но результат получился не такой как хотелось бы(

http://screenshot.ru/aaae8126b60031767903634b0145c374.png

заметьте что результат count выводит 1 хотя в категории нет записей
т.е записи у меня имеются 2 в Машины и 1 в Iphone и как получить общее кол-во в родительской категории? сделать еще запрос?

Думаю что бы получить общее кол-во т.е из родительской категории, пробежаться в цикле по полученному массиву и сложить все из под категорий для родителя. Но вот как избавиться от недочетности что бы если записи не было выводила 0 или NULL
Дамп всей БД:


-- phpMyAdmin SQL Dump
-- version 4.0.10.6
-- <a href="http://www.phpmyadmin.net">http://www.phpmyadmin.net</a>
--
-- Хост: 127.0.0.1:3306
-- Время создания: Янв 22 2015 г., 11:30
-- Версия сервера: 5.5.41-log
-- Версия PHP: 5.3.29

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- База данных: `shop`
--

-- --------------------------------------------------------

--
-- Структура таблицы `shop_catalogParent`
--

CREATE TABLE IF NOT EXISTS `shop_catalogParent` (
  `catalog_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `catalog_name` varchar(80) NOT NULL,
  `catalog_position` tinyint(2) unsigned NOT NULL DEFAULT '0',
  `catalog_visible` tinyint(1) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`catalog_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

--
-- Дамп данных таблицы `shop_catalogParent`
--

INSERT INTO `shop_catalogParent` (`catalog_id`, `catalog_name`, `catalog_position`, `catalog_visible`) VALUES
(1, 'Игрушки', 1, 1),
(2, 'Телефоны', 2, 1),
(3, 'Ноутбуки', 3, 1),
(4, 'Мебель', 4, 0);

-- --------------------------------------------------------

--
-- Структура таблицы `shop_catalogProducts`
--

CREATE TABLE IF NOT EXISTS `shop_catalogProducts` (
  `product_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_title` varchar(255) NOT NULL,
  `product_keywords` varchar(255) NOT NULL,
  `product_description` varchar(255) NOT NULL,
  `product_img` varchar(255) NOT NULL DEFAULT 'no_image.jpg',
  `product_imgSlide` varchar(255) NOT NULL DEFAULT 'no_image.jpg',
  `product_parent` tinyint(3) unsigned NOT NULL,
  `product_content` text NOT NULL,
  `product_visible` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `product_hit` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `product_hot` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `product_new` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `product_onTop` tinyint(1) NOT NULL DEFAULT '2',
  `product_price` int(7) NOT NULL DEFAULT '0',
  `product_fullPrice` int(7) NOT NULL DEFAULT '0',
  `product_discount` int(3) NOT NULL DEFAULT '0',
  `product_forSale` int(10) NOT NULL DEFAULT '0',
  `product_endTime` int(10) NOT NULL DEFAULT '0',
  `product_beginPeriod` int(10) NOT NULL DEFAULT '0',
  `product_endPeriod` int(10) NOT NULL DEFAULT '0',
  `product_onMap` int(1) NOT NULL DEFAULT '0',
  `product_companyName` varchar(255) NOT NULL,
  `product_companyUrl` varchar(255) NOT NULL,
  `product_companyPhone` varchar(255) NOT NULL,
  `product_companyAddress` varchar(255) NOT NULL,
  `product_companyDescription` text NOT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Дамп данных таблицы `shop_catalogProducts`
--

INSERT INTO `shop_catalogProducts` (`product_id`, `product_title`, `product_keywords`, `product_description`, `product_img`, `product_imgSlide`, `product_parent`, `product_content`, `product_visible`, `product_hit`, `product_hot`, `product_new`, `product_onTop`, `product_price`, `product_fullPrice`, `product_discount`, `product_forSale`, `product_endTime`, `product_beginPeriod`, `product_endPeriod`, `product_onMap`, `product_companyName`, `product_companyUrl`, `product_companyPhone`, `product_companyAddress`, `product_companyDescription`) VALUES
(1, 'Товар 1', '', '', 'no_image.jpg', 'no_image.jpg', 2, '', 1, 1, 0, 0, 2, 990, 14000, 53, 0, 0, 0, 0, 0, '', '', '', '', ''),
(2, 'Товар 2', '', '', 'no_image.jpg', 'no_image.jpg', 2, '', 1, 1, 0, 0, 2, 990, 14000, 53, 0, 0, 0, 0, 0, '', '', '', '', ''),
(3, 'Товар 3', '', '', 'no_image.jpg', 'no_image.jpg', 3, '', 1, 0, 0, 0, 2, 390, 16500, 72, 0, 0, 0, 0, 0, '', '', '', '', '');

-- --------------------------------------------------------

--
-- Структура таблицы `shop_catalogSub`
--

CREATE TABLE IF NOT EXISTS `shop_catalogSub` (
  `sub_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `sub_name` varchar(80) NOT NULL,
  `parent_catalog` tinyint(3) unsigned NOT NULL,
  `sub_position` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `sub_visible` tinyint(1) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`sub_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=46 ;

--
-- Дамп данных таблицы `shop_catalogSub`
--

INSERT INTO `shop_catalogSub` (`sub_id`, `sub_name`, `parent_catalog`, `sub_position`, `sub_visible`) VALUES
(1, 'Куклы', 1, 1, 1),
(2, 'Машины', 1, 2, 1),
(3, 'Iphone', 2, 1, 1),
(4, 'Apple', 3, 1, 1),
(5, 'Диваны', 4, 1, 1);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 

Отредактированно saylar_06 (22.01.2015 11:48:23)

Неактивен

 

#4 22.01.2015 12:36:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подскажите с запросом, три запроса в одном?

saylar_06 написал:

Спасибо Вам за Вашу помощь! Но результат получился не такой как хотелось бы(

http://screenshot.ru/aaae8126b600317679 … 45c374.png

заметьте что результат count выводит 1 хотя в категории нет записей

вместо count(*)
нужно count(shop_catalogProducts.product_parent)

Неактивен

 

#5 22.01.2015 12:45:11

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подскажите с запросом, три запроса в одном?

saylar_06 написал:

т.е записи у меня имеются 2 в Машины и 1 в Iphone и как получить общее кол-во в родительской категории? сделать еще запрос?

Да, отдельным запросом.

saylar_06 написал:

Думаю что бы получить общее кол-во т.е из родительской категории, пробежаться в цикле по полученному массиву и сложить все из под категорий для родителя.

Можно, но проще сразу посчитать для родительской категории.


SELECT shop_catalogParent.*, count(shop_catalogProducts.product_parent) FROM (shop_catalogSub
                INNER JOIN shop_catalogParent ON
                    shop_catalogSub.parent_catalog = shop_catalogParent.catalog_id)
left JOIN shop_catalogProducts ON
                    shop_catalogSub.sub_id = shop_catalogProducts.product_parent
                    WHERE
                        shop_catalogParent.catalog_visible = 1 AND shop_catalogSub.sub_visible = 1
 group by shop_catalogParent.catalog_id
                        ORDER BY catalog_position;

Неактивен

 

#6 22.01.2015 12:58:59

saylar_06
Участник
Зарегистрирован: 01.09.2014
Сообщений: 13

Re: Подскажите с запросом, три запроса в одном?

Спасибо большое!

получается у меня будет два запроса, результаты которых я уже обработаю в цикле? что бы у меня получился один массив с необхдоимыми данными

Неактивен

 

#7 22.01.2015 13:19:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подскажите с запросом, три запроса в одном?

Если сливать все в один массив, то информация о кол-ве в родительской категории будет дублироваться. В принципе, вы можете и эти запросы объединить через join.

Если говорить о практическом применении, то имеет смысл сразу хранить эту информацию в таблицах shop_catalogParent и shop_catalogSub. А при добавлении, удалении товара пересчитывать.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson