Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Помогите c count из двух таблиц (AlexanderTV) 27/12/2010 - 23:35:40
      Re: Помогите c count из двух таблиц (AlexanderTV) 28/12/2010 - 09:21:31

> Original message text:
> From: AlexanderTV - 27/12/2010 - 23:35:40
> Subject:Помогите c count из двух таблиц
> -----------------
> Есть две таблицы. Одна с заказами, вторая привязанная к заказам таблица с товарами.
> table_1 : заказы
> table_2 : товары
>
> Необходимо посчитать одним запросом количество заказов или товаров по определенному критерию, например по дате.
> Заодно хотелось бы что бы этот запрос не нагружал сервак.
>
> Структура таблицы с заказами:
> CREATE TABLE `table_1` (
> `number_order` INT(10) NOT NULL ,
> `date_order` DATE NOT NULL ,
> `client_id` INT(10) NOT NULL ,
> PRIMARY KEY (`number_order`)
> ) ENGINE = MYISAM;
>
> Структура таблицы с товарами
> CREATE TABLE `table_2` (
> `goods_id` INT(10) NOT NULL ,
> `number_order` INT(10) NOT NULL ,
> `goods_code` INT(10) NOT NULL ,
> `goods_cena` INT(10) NOT NULL ,
> PRIMARY KEY (`goods_id`)
> ) ENGINE = MYISAM;
>
> ---
> Содержимое таблицы с заказами:
> number_order, date_order, client_id
> -
> INSERT INTO `table_1` VALUES
> ('1', '2010-02-20', '1'),
> ('2', '2010-02-20', '2'),
> ('3', '2010-02-21', '3'),
> ('4', '2010-02-21', '4'),
> ('5', '2010-02-22', '5'),
> ('6', '2010-02-22', '6'),
> ('7', '2010-02-22', '7'),
> ('8', '2010-02-22', '8'),
> ('9', '2010-02-22', '9'),
> ('10', '2010-02-23', '10');
> ---
>
> Ссодержиме таблицы с товарами
> goods_id, number_order, goods_code, goods_cena
> -
> INSERT INTO `table_2` VALUES
> ('1', '1', '123', '100'),
> ('2', '2', '123', '100'),
> ('3', '3', '123', '100'),
> ('4', '4', '123', '100'),
> ('5', '5', '123', '100'),
> ('6', '6', '123', '100'),
> ('7', '7', '123', '100'),
> ('8', '7', '123', '100'),
> ('9', '7', '123', '100'),
> ('10', '7', '123', '100'),
> ('11', '7', '123', '100'),
> ('12', '7', '123', '100'),
> ('13', '8', '123', '100'),
> ('14', '9', '123', '100'),
> ('15', '10', '123', '100');
> -
> ----------
> Необходимо сделать запрос который посчитает количество заказов и товаров за 2010-02-22.
> За 2010-02-22 должно выдать
> Заказов: 5
> Товаров: 10
>
> Если делать два отдельных запроса то работает без проблем.
>
> По отдельности:
> Посчитать заказы:
> -
> SELECT count(`table_1`.`number_order`) AS 'count_orders' from table_1
> where `table_1`.`date_order` = '2010-02-22'
> -
> Результат: 5
> -------
> Посчитать товары:
> -
> SELECT count(`table_2`.`number_order`) AS 'count_goods' from table_1
> LEFT JOIN `table_2` ON `table_1`.`number_order` = `table_2`.`number_order`
> where `table_1`.`date_order` = '2010-02-22'
> -
> Результат: 10
> -------
> Посчитать заказы и товары
>
> SELECT
> count(`table_1`.`number_order`) AS 'count_orders',
> count(`table_2`.`number_order`) AS 'count_goods'
> from table_1
> LEFT JOIN `table_2` ON `table_1`.`number_order` = `table_2`.`number_order`
> where `table_1`.`date_order` = '2010-02-22'
> Резултат: 10 10
>
> А надо 5 и 10
>
> В таком духе:
> ----------------------------
> | count_orders | count_goods |
> |----------------------------
> | 5 | 10 |
> ----------------------------
>
> Union не предлагать, т.к.
> При использовании Union время выполнения запроса равно времени двух запросов.
> По отдельности:
> 1й запрос - 0.2218 сек.
> 2й запрос - 0.2495 сек.
>
> 2 запроса с UNION - 0.4838 сек.
> А хотелось бы уложится в те-же 0.20 - 0.30 т.к. планируется выбирать много значений и если запросы сплюсуются по времени то выйдет пара тройка секунд.
>
> И результат выдается одним columns'ом
> count_orders
> 5
> 10
>
> А хотелось бы:
> count_orders count_goods
> ----------------------------
> | count_orders | count_goods |
> |----------------------------
> | 5 | 10 |
> ----------------------------
>
> В один запрос надо по причине того что бы еще 10 значений таким же образом сунуть в запрос, а не делать 10 запросов.
> Заранее спасибо. Бьюсь уже не один день :(
>
>


From: AlexanderTV - 28/12/2010 - 09:21:31
Subject:Помогите c count из двух таблиц
-----------------
Временно решил проблему при помощи удаления дублей опцией DISTINCT

SELECT
count(DISTINCT `table_1`.`number_order`) AS 'count_orders',
count(`table_2`.`number_order`) AS 'count_goods'
from table_1
LEFT JOIN `table_2` ON `table_1`.`number_order` = `table_2`.`number_order`
where `table_1`.`date_order` = '2010-02-22'

Результат: 5 10

Но сдается мне это не верное решение.....
Т.К. Я знаю что заказов не может быть больше чем товаров и добавил DISTINCT в count(DISTINCT `table_1`.`number_order`), но в других ситуациях может быть -
где то первых значений больше, а где то вторых.

так что тема не раскрыта :)


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
37805



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |