Новости
Документация
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



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 запросов.
Заранее спасибо. Бьюсь уже не один день :(



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

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

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



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