我只是在按酒店计算每个房间的总价格时遇到了一点问题。
例如:
ROOM_1_TOTAL 在 Hotel_ID 为 1 的每一行上为 170。ROOM_2_TOTAL 在 Hotel_ID 为 1 的每一行上为 170。
ROOM_1_TOTAL 在 Hotel_ID 为 2 的每一行上为 10。(我确定,它不工作) ROOM_2_TOTAL 在 Hotel_ID 为 2 的每一行上为 10。(当然,它不工作)
等等...
这是我的代码以及输出..
http://sqlfiddle.com/#!2/575d3/2
MYSQL查询:
数据库结构和虚拟数据...
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