admGT
Новичок
обойти вложенный запрос
Имеется 4 таблицы: CREATE TABLE `locations` (
`locId` int(11) NOT NULL AUTO_INCREMENT,
`locName` text NOT NULL,
PRIMARY KEY (`locId`)
) ENGINE=MyISAM;
CREATE TABLE `objects` (
`objectId` int(11) NOT NULL AUTO_INCREMENT,
`objectName` text,
`locId` tinyint(4) NOT NULL,
PRIMARY KEY (`objectId`)
) ENGINE=MyISAM ;
CREATE TABLE `orders` (
`setId` int(11) NOT NULL,
`objectId` int(11) NOT NULL,
PRIMARY KEY (`setId`)
) ENGINE=InnoDB;
CREATE TABLE `sets` (
`setId` int(11) NOT NULL AUTO_INCREMENT,
`termDate` datetime NOT NULL,
PRIMARY KEY (`setId`)
) ENGINE=InnoDB;
В реале таблицы конечно имеют больше полей, но для упрощения задачи они опущены.
Задача: Имеется таблица locations, допустим, содержащая города (id, название), objects - филиалы (id,название,id города), заказы sets, содержащая id заказа и дату заказа, orders - соединительная таблица (id заказа, id филиала)
Необходимо выбрать количество заказов по каждому из филиалов за сегодня. Если заказов сегодня нет, необходимо написать 0 )
Пишем запрос: SELECT COUNT(`sets`.`setId`) AS `cntDay`,`locations`.`locName`,`objects`.`objectName` FROM `sets` STRAIGHT JOIN `orders` ON `sets`.`setId`=`orders`.`setId` JOIN `objects` ON `objects`. `objectId`=`orders`.`objectId` JOIN `locations` ON `locations`.`locId`=`objects`.`locId` WHERE `sets`.`termDate`>CURDATE() GROUP BY `objects`.`objectId`
При этом запросе, если за сегодня заказов нет, то и locName и objectName отображаться не будут. Как можно побороть? Первая мысль была использовать вложенный селект, в который поместить count(`setId`). Даже если количество заказов за сегодня равно нулю, название филиала будет выведено. Но отказался от такого решения в связи с жуткими тормозами.
Имеется 4 таблицы: CREATE TABLE `locations` (
`locId` int(11) NOT NULL AUTO_INCREMENT,
`locName` text NOT NULL,
PRIMARY KEY (`locId`)
) ENGINE=MyISAM;
CREATE TABLE `objects` (
`objectId` int(11) NOT NULL AUTO_INCREMENT,
`objectName` text,
`locId` tinyint(4) NOT NULL,
PRIMARY KEY (`objectId`)
) ENGINE=MyISAM ;
CREATE TABLE `orders` (
`setId` int(11) NOT NULL,
`objectId` int(11) NOT NULL,
PRIMARY KEY (`setId`)
) ENGINE=InnoDB;
CREATE TABLE `sets` (
`setId` int(11) NOT NULL AUTO_INCREMENT,
`termDate` datetime NOT NULL,
PRIMARY KEY (`setId`)
) ENGINE=InnoDB;
В реале таблицы конечно имеют больше полей, но для упрощения задачи они опущены.
Задача: Имеется таблица locations, допустим, содержащая города (id, название), objects - филиалы (id,название,id города), заказы sets, содержащая id заказа и дату заказа, orders - соединительная таблица (id заказа, id филиала)
Необходимо выбрать количество заказов по каждому из филиалов за сегодня. Если заказов сегодня нет, необходимо написать 0 )
Пишем запрос: SELECT COUNT(`sets`.`setId`) AS `cntDay`,`locations`.`locName`,`objects`.`objectName` FROM `sets` STRAIGHT JOIN `orders` ON `sets`.`setId`=`orders`.`setId` JOIN `objects` ON `objects`. `objectId`=`orders`.`objectId` JOIN `locations` ON `locations`.`locId`=`objects`.`locId` WHERE `sets`.`termDate`>CURDATE() GROUP BY `objects`.`objectId`
При этом запросе, если за сегодня заказов нет, то и locName и objectName отображаться не будут. Как можно побороть? Первая мысль была использовать вложенный селект, в который поместить count(`setId`). Даже если количество заказов за сегодня равно нулю, название филиала будет выведено. Но отказался от такого решения в связи с жуткими тормозами.