选择日期之间的房间可用性(sql查询)

Posted

技术标签:

【中文标题】选择日期之间的房间可用性(sql查询)【英文标题】:Select room availability between date (sql Query) 【发布时间】:2014-08-12 01:48:42 【问题描述】:

我在使用 SQL 查询时遇到了一些问题。我正在从输入表单中寻找日期之间的可用房间。

这是表架构:

餐桌室

id_room, room_name, alootment ex : 1, vip, 10

餐桌价格

id_price、id_room、价格、日期

例如:1、1、10、2014-05-1 | 1, 1, 20, 2014-05-2 | 1、1、10、2014-05-3

订桌

id_booking、id_room、日期 ex : 1, 1, 2014-05-1 | 2, 1, 2014-05-1 | 3, 1, 2014-05-1

我正在寻找的是:

如果有人从2014-5-12014-05-3预订vip房间,房间数量是8

然后返回空白(因为vip房间有10个配额,而2014-05-1是3个预订,所以只剩下7个房间)

这是 sql 查询

select room_name, COUNT( SELECT FROM booking WHERE date between '$checkin' and '$checkout') as total_booking, from room where allotment <= total_boking

【问题讨论】:

【参考方案1】:

这是 mysql 吗?

语法错误;此外,date 是保留名称。请参阅下面我修改后的表格和 SQL。

SELECT
    room.room_name,
    (SELECT COUNT(*) FROM booking WHERE booking.booking_date BETWEEN '' AND '') AS     total_booking
FROM
room
WHERE room.allotment <= (SELECT COUNT(*) FROM booking WHERE booking.booking_date BETWEEN '' AND '')

这是表架构;

-- ----------------------------
-- Table structure for `booking`
-- ----------------------------
DROP TABLE IF EXISTS `booking`;
CREATE TABLE `booking` (
`id_booking` int(10) NOT NULL,
`id_room` int(10) NOT NULL,
`booking_date` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


-- ----------------------------
-- Table structure for `price`
-- ----------------------------
DROP TABLE IF EXISTS `price`;
CREATE TABLE `price` (
`id_price` int(10) NOT NULL,
`id_room` int(10) NOT NULL,
`price` int(10) NOT NULL,
`price_date` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


-- ----------------------------
-- Table structure for `room`
-- ----------------------------
DROP TABLE IF EXISTS `room`;
CREATE TABLE `room` (
`id_room` int(10) NOT NULL,
`room_name` varchar(100) NOT NULL,
`allotment` int(10) NOT NULL,
PRIMARY KEY (`id_room`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

【讨论】:

是的,在 php 上运行此代码,我有错误结果。 tq 反馈 我做了一点改动。 MySQL 与 php 无关,因为 php 可以使用其他数据库。包含您的 php 代码不会有什么坏处。 :)【参考方案2】:

我倾向于将您的查询写成:

select room_name,
       (SELECT COUNT(*)
        FROM booking b
        WHERE b.id_room = r.id_room and date between '$checkin' and '$checkout'
       ) as total_booking
from room r
having allotment <= total_booking;

请注意,子查询现在与外部查询相关联,因此total_booking 是针对每个房间的。

这也使用了 MySQL 扩展,您可以在其中使用在 select 子句中定义的列别名通过使用 where 子句进行过滤。

【讨论】:

以上是关于选择日期之间的房间可用性(sql查询)的主要内容,如果未能解决你的问题,请参考以下文章

如果一个日期包含 null,则在两个日期之间选择

SQL查询以选择两个日期之间的日期

如何在两个日期之间的时间选择一条记录

用于检查房间可用性的 SQL 查询

SQL查询选择年份在两个日期之间的行

SQL 查询不会选择日期之间的所有行