我有一个名为room_prices的表,根据指定的日期存储不同的价格。这是样本数据。
id room_id date_from date_to price
1 1 3500.00
25 1 7/28/2012 7/29/2012 3600.00
27 1 8/24/2012 8/27/2012 3000.00
49 1 11/12/2012 11/16/2012 4000.00
第一行是房间1的默认价格(room_id = 1)。
当客人预订房间时,系统将首先查看room_prices表上的价格。如果在表格中找到了客人预订的日期,它将根据所选日期获得价格,而不是默认价格。
实施例
如果客人预订了从2012年10月11日至11月11日的房间,则价格应为3,500。 如果客人预订了从2012年12月11日至2012年11月14日的房间,则价格应为4,000。
如果客人预订了从2012年10月11日至2012年11月13日的房间,则平均价格应为3750.参见下表:
11/10/2012 3500
11/11/2012 3500
11/12/2012 4000
11/13/2012 4000
3750
所以我的问题是,是否只有一个SQL代码来获得平均价格。
更新
我试过这个sql无济于事:
SELECT avg(price) as avg_price
FROM lf_rooms_prices
WHERE room_id = 1
AND ((DATE_FORMAT(date_from, '%m/%d/%Y') >= '11/10/2012'
AND DATE_FORMAT(date_from, '%m/%d/%Y') < '11/10/2012')
OR (DATE_FORMAT(date_to, '%m/%d/%Y') > '11/13/2012'
AND DATE_FORMAT(date_to, '%m/%d/%Y') <= '11/13/2012'))
不过,我正在使用codeigniter。
答案 0 :(得分:1)
有AVG()
功能,因此要获得平均价格,您的查询应如下所示:
SELECT AVG(`price`) FROM `room_prices` GROUP BY `room_id`
请参阅文档here。当然,您可以在查询中添加WHERE以缩小您想要的平均值的数据集:
SELECT AVG(`price`) FROM `room_prices` WHERE <CONDITIONS> GROUP BY `room_id`
修改强>
完整查询:
SELECT AVG(`price`) FROM `room_prices`
WHERE `room_id` = 1
AND ((DATE_FORMAT(date_from, '%m/%d/%Y') >= '11/10/2012'
AND DATE_FORMAT(date_from, '%m/%d/%Y') < '11/10/2012')
OR (DATE_FORMAT(date_to, '%m/%d/%Y') > '11/13/2012'
AND DATE_FORMAT(date_to, '%m/%d/%Y') <= '11/13/2012'))
GROUP BY `room_id`
关键是使用GROUP BY
。