我在计算每间客房的总价时遇到一点问题。
例如:
ROOM_1_TOTAL在Hotel_ID为1的每一行上都是170。 在Hotel_ID为1的每一行,ROOM_2_TOTAL为170。
ROOM_1_TOTAL在Hotel_ID为2的每一行都是10个。(我确定,它不起作用) 在Hotel_ID为2的每行中,ROOM_2_TOTAL为10(当然,它不起作用)
等等......
这是我的代码以及输出..
http://sqlfiddle.com/#!2/575d3/2
MYSQL QUERY:
DB结构和虚拟数据......
CREATE TABLE IF NOT EXISTS `omc_hotel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `omc_hotel` (`id`, `name`) VALUES
(1, 'Hotel ABC'),
(2, 'Hotel CSB'),
(3, 'Hotel CSD'),
(4, 'Hotel NDG');
CREATE TABLE IF NOT EXISTS `omc_hotel_room` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`pax_min` int(11) DEFAULT NULL,
`pax_max` int(11) DEFAULT NULL,
`quantity` int(11) DEFAULT NULL,
`hotel_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
INSERT INTO `omc_hotel_room` (`id`, `name`, `pax_min`, `pax_max`, `quantity`, `hotel_id`) VALUES
(1,'Single',1,1,150,1),
(2,'Single',1,1,250,2),
(3,'Double',2,2,200,1),
(4,'Double',2,2,405,2),
(5,'Double',1,1,405,3),
(6,'Double Delax',2,2,50,3),
(7,'Double',1,1,100,4);
CREATE TABLE IF NOT EXISTS `omc_hotel_room_extra_quota` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hotel_id` int(11) NOT NULL,
`room_type_id` int(11) NOT NULL,
`quantity` int(11) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `omc_hotel_room_extra_quota` (`id`, `hotel_id`, `room_type_id`, `quantity`, `date`) VALUES
(1, 1, 1, -10, '2013-08-13'),
(2, 1, 3, -10, '2013-08-25'),
(3, 2, 2, 0, '2013-09-26'),
(4, 2, 4, 0, '2013-09-27'),
(5, 3, 5, 0, '2013-10-28'),
(6, 3, 5, 0, '2013-10-09');
CREATE TABLE IF NOT EXISTS `omc_hotel_room_pricelist` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hotel_id` int(11) NOT NULL,
`room_type_id` int(11) NOT NULL,
`season_id` int(11) NOT NULL,
`price_normal` decimal(5,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci;
INSERT INTO `omc_hotel_room_pricelist` (`id`, `hotel_id`, `room_type_id`, `season_id`, `price_normal`) VALUES
(1, 1, 1, 1, 50.00),
(2, 2, 2, 2, 10.00),
(3, 1, 1, 1, 35.00),
(4, 1, 1, 2, 70.00),
(5, 1, 1, 1, 80.00),
(6, 2, 4, 1, 80.00),
(7, 4, 7, 2, 80.00),
(8, 3, 6, 1, 80.00),
(9, 3, 5, 1, 30.00);
CREATE TABLE IF NOT EXISTS `omc_hotel_season_period` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hotel_id` int(11) NOT NULL,
`season_id` int(11) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci;
INSERT INTO `omc_hotel_season_period` (`id`, `hotel_id`, `season_id`, `date`) VALUES
(1, 1, 1, '2013-08-13'),
(2, 1, 1, '2013-08-14'),
(3, 1, 2, '2013-08-15'),
(4, 2, 1, '2013-08-13'),
(5, 2, 1, '2013-08-14'),
(6, 2, 2, '2013-08-15'),
(7, 3, 2, '2013-08-13'),
(8, 3, 2, '2013-08-14'),
(9, 3, 1, '2013-08-15'),
(10, 1, 1, '2013-08-13'),
(11, 1, 1, '2013-08-14'),
(12, 1, 1, '2013-08-14');
SELECT candidates.hotel_id, omc_hotel_season_period.season_id,
room_1_id, r1_price.price_normal AS room_1_price, SUM(r1_price.price_normal) as room_1_total,
room_2_id,r2_price.price_normal AS room_2_price,SUM(r2_price.price_normal) as room_2_total,
omc_hotel_season_period.date
FROM (SELECT r1.hotel_id, r1.id AS room_1_id, r2.id AS room_2_id FROM omc_hotel_room r1
INNER JOIN omc_hotel_room r2 ON r1.hotel_id = r2.hotel_id
WHERE r1.quantity >= 3 AND r2.quantity >= 4 AND r1.pax_max = 1 AND r2.pax_max = 2) AS candidates
LEFT JOIN omc_hotel_season_period
ON candidates.hotel_id = omc_hotel_season_period.hotel_id
AND date BETWEEN '2013-08-13' AND '2013-08-15'
AND omc_hotel_season_period.date <> 0
LEFT JOIN omc_hotel_room_pricelist r1_price
ON (candidates.hotel_id = r1_price.hotel_id
AND room_1_id= r1_price.room_type_id)
LEFT JOIN omc_hotel_room_pricelist r2_price
ON (candidates.hotel_id = r2_price.hotel_id
AND room_1_id = r2_price.room_type_id)
WHERE
r1_price.season_id = omc_hotel_season_period.season_id
AND
r2_price.season_id = omc_hotel_season_period.season_id
GROUP BY candidates.hotel_id, omc_hotel_season_period.date
答案 0 :(得分:0)
试试这个,看看这是不是你想要的。
SELECT candidates.hotel_id, omc_hotel_season_period.season_id,
room_1_id, r1_price.price_normal AS room_1_price, SUM(r1_price.price_normal) as room_1_total,
room_2_id,r2_price.price_normal AS room_2_price,SUM(r2_price.price_normal) as room_2_total,
omc_hotel_season_period.date,
(SELECT SUM(room1_price.price_normal)
FROM omc_hotel_room_pricelist room1_price
INNER JOIN omc_hotel_room room1 ON room1_price.hotel_id = room1.hotel_id
INNER JOIN omc_hotel_season_period so1 ON room1_price.hotel_id = so1.hotel_id AND room1_price.season_id = so1.season_id
INNER JOIN omc_hotel hotel1 ON room1_price.hotel_id = hotel1.id
WHERE
so1.date BETWEEN '2013-08-13' AND '2013-08-15' AND
room1.quantity >= 3 AND room1.pax_max = 1 AND
hotel1.id = candidates.hotel_id
GROUP BY candidates.hotel_id
) AS room_1_sum
FROM (SELECT r1.hotel_id, r1.id AS room_1_id, r2.id AS room_2_id FROM omc_hotel_room r1
INNER JOIN omc_hotel_room r2 ON r1.hotel_id = r2.hotel_id
WHERE r1.quantity >= 3 AND r2.quantity >= 4 AND r1.pax_max = 1 AND r2.pax_max = 2) AS candidates
LEFT JOIN omc_hotel_season_period
ON candidates.hotel_id = omc_hotel_season_period.hotel_id
AND date BETWEEN '2013-08-13' AND '2013-08-15'
AND omc_hotel_season_period.date <> 0
LEFT JOIN omc_hotel_room_pricelist r1_price
ON (candidates.hotel_id = r1_price.hotel_id
AND room_1_id= r1_price.room_type_id)
LEFT JOIN omc_hotel_room_pricelist r2_price
ON (candidates.hotel_id = r2_price.hotel_id
AND room_1_id = r2_price.room_type_id)
WHERE
r1_price.season_id = omc_hotel_season_period.season_id
AND
r2_price.season_id = omc_hotel_season_period.season_id
GROUP BY candidates.hotel_id