私は初心者ですが、私はWeb開発の芸術を習得しようとしていて、SQLiteクエリのために自分の学習プロセスで惨めに失敗しています。空室状況チェックSQLiteクエリ
これは私のDBの設計です:
私が利用可能なお部屋を探したいが、私のクエリは、ちょうど私に正しい結果が得られていません!
SQLite DBに偽の予約を手動で入力し、すでに予約されているのと同じ日付のさまざまなクエリを実行しましたが、予約日はクエリ日の前後に実際に利用可能であるため、しかし、クエリの日付は重要な日付です!それは予約された部屋が全く現れてはならない理由です!しかし、私は正しいクエリを思い付くことができませんでした!
マイフェイク予約:
:2016年5月13日に2016年5月10日から予約ルーム数101と
Aシングルルームこれは、これまでの私の「最高の」クエリです
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
のタイプです。
あなたは私を助けてくれますか?
また、私はPRAGMA Foreign KeysのことをPHPで正しく行っていますか?予約テーブルの得意先コードとルーム番号は外部キーです。
<?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とBとC)または(DとEとF)または...と仮定されていることを確かめましょう。また、同様に単純化すると、4回チェックしてRoomType = 'SR '、それは一度それをチェックする必要があります。 – Dresden