X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> MySQL, left join, group by, сумма и 3 таблицы.
alexdrob
alexdrob
Topic Starter сообщение 25.4.2012, 23:42; Ответить: alexdrob
Сообщение #1


Что то с активрекорд совсем забыл нормальный язык sql :D
вот есть три таблицы.

select ..., sum(t2.field) as f1, sum(t3.field) as f2 from t1 left join t2 on t1.date = t2.date
left join t3 on t1.date = t3.date
where ...
group by t1.date

так вот.
в таблицах t2 и t3 может быть по несколько строк с одной и той же датой.
SET NAMES utf8;

DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`field` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

insert into `t1`(`id`,`date`,`field`) values
(1,'2012-04-25',5),
(2,'2012-04-24',7),
(3,'2012-04-23',1);


DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`field` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

insert into `t2`(`id`,`date`,`field`) values
(1,'2012-04-25',6),
(2,'2012-04-24',8);


DROP TABLE IF EXISTS `t3`;
CREATE TABLE `t3` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`field` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

insert into `t3`(`id`,`date`,`field`) values
(1,'2012-04-25',5),
(2,'2012-04-25',9),
(3,'2012-04-23',2),
(4,'2012-04-22',1);


вот запрос
select t1.date, t1.field, sum(t2.field) as f1, sum(t3.field) as f2 from t1 left join t2 on t1.date = t2.date
left join t3 on t1.date = t3.date
group by t1.date


выводит
2012-04-23 1 Null 2
2012-04-24 7 8 Null
2012-04-25 5 12 14


обратите внимание на 3 строку, число 12, это число получилось из за того, что встретилось 2 даты 2012-04-25 в t3.
то есть в t2 - 1 строка с этой датой и там число 6
а во второй 2 строки с этой датой, по этому 6 стало 12!

правильно выведет если написать так
select
t1.date,
t1.field,
(select sum(t2.field) from t2 where t1.date = t2.date) as f1,
(select sum(t3.field) from t3 where t1.date = t3.date) as f2
from t1 group by t1.date

2012-04-23 1 Null 2
2012-04-24 7 8 Null
2012-04-25 5 6 14

но будет ли это нормально с точки зрения быстродействия, много раз читал что нужно избегать вложенных запросов :)

ну и ещё вопрос назрел, а вдруг в первой таблице не будет какой то даты, которая есть в одной из других таблиц, тогда как быть :)
добавил строку (4,'2012-04-22',1); в t3
вот она вообще не тем не тем запросом не выведется. а любой их 3х таблиц можеть быть дата, который нет в других 2х

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery
Разработка сайтов и сервисов под-ключ
0 alexey 1245 24.11.2023, 14:46
автор: alexey
Открытая тема (нет новых ответов) Web программирование на С/С++/PHP/MySQL/SQL, высоконагруженные проекты
Есть наработки в области бирж трафика, топов, тизеров, видео cj-тубов
4 DFService 3354 8.4.2020, 18:02
автор: DFService
Открытая тема (нет новых ответов) Верстка, php + mysql, недорого
3 devprojectlab 2656 28.10.2019, 18:53
автор: Mukis
Открытая тема (нет новых ответов) Bitobmen24x7.ru Минимальная сумма обмена от 500 рублей
4 Bitobmen24x7 2153 17.6.2019, 23:07
автор: Bitobmen24x7
Открытая тема (нет новых ответов) AM.mks.group 1Click партнерская программа Amediateka с лицензионным видео контентом
13 MKS partners 3389 8.4.2019, 21:25
автор: -MKS partners-


 



RSS Текстовая версия Сейчас: 25.4.2024, 6:11
Дизайн