Что то с активрекорд совсем забыл нормальный язык 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+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
|