【发布时间】:2016-08-12 07:39:16
【问题描述】:
我是新手,但我正在努力掌握 Web 开发的艺术,但由于 SQLite 查询,我在学习过程中惨遭失败。
这是我的数据库设计:
我想寻找可用的房间,但我的查询没有给我正确的结果!!!
我用虚假预订手动填充 SQLite 数据库,然后针对已预订的完全相同的日期运行各种查询,但预订的房间一直显示为可用,因为它在查询日期之前和之后确实可用!但查询日期是重要日期!这就是为什么预订的房间根本不应该出现!但我无法提出正确的查询!
我的假预订:
2016 年 5 月 10 日至 2016 年 5 月 13 日预订房间号 101 的单人间
这是我迄今为止“最好的”查询:
SELECT * FROM Rooms NATURAL LEFT JOIN Booking WHERE RoomType='SR' AND
Checkout IS NULL OR Arrival <= '2016-05-10' AND Checkout <= '2016-05-10'
AND RoomType='SR' OR Arrival >= '2016-05-13' AND Checkout >= '2016-05-13'
AND RoomType='SR' OR Arrival <> '2016-05-10' AND Checkout <> '2016-05-13'
AND RoomType='SR';
SR 是 RoomType(单人房)
当我运行查询时,101 号房间需要从结果集中完全消失!但是 101 不断出现!
Arrival 和 Checkout 字段在 SQLite DB 中属于 DATE 类型。
你们能帮帮我吗?
另外,我是否在 PHP 中正确执行 PRAGMA 外键? Booking 表中的 CustomerID 和 RoomNumber 是外键。
<?php
$db = new PDO('sqlite:gshotel.db');
$db->exec('PRAGMA foreign_keys = ON;');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
prepare...
execute...
?>
非常感谢
【问题讨论】:
-
使用括号。很确定您的 WHERE 子句应该是 (A and B and C) 或 (D and E and F) or... 也简化它,您不需要检查 4 次以确保 RoomType='SR ',你只需要检查一次。