0

シンプルな予約システムを作ろうとしています。reservation予約時間と、それを予約した顧客の ID を保持するという名前のテーブルがあります(スキーマについては以下を参照してください)。そして、私は別のテーブルを持っていますroom。このテーブルは部屋タイプ用です。したがって、各タイプの部屋には、サイズと価格のエントリがこのテーブルに含まれています。roomsそして、各部屋についての実際のエントリー用の別のテーブル。私が作成しようとしているクエリでは、特定のタイプで、指定されたタイム スライスで利用可能な部屋を 1 つ選択したいと考えています。このようなもの;

Select number from rooms where type = 4 and available between $start-date and $end-date;

クエリの一部の間に available を書き込む方法がわかりませんでした。私のスキーマの関連部分は次のとおりです。

CREATE TABLE IF NOT EXISTS `reservation` (
  `rid` int(11) NOT NULL AUTO_INCREMENT, /* reservation id */
  `number` int(11) NOT NULL, /* number of the room for this reservation */
  `cid` int(11) NOT NULL, /* customer id */
  `begin` date NOT NULL,
  `end` date NOT NULL,
  PRIMARY KEY (`rid`),
);

CREATE TABLE IF NOT EXISTS `room` (
  `rid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `size` tinyint(3) unsigned NOT NULL,
  `price` float NOT NULL,
  PRIMARY KEY (`rid`)
);

CREATE TABLE IF NOT EXISTS `rooms` (
  `number` smallint(5) unsigned NOT NULL,
  `type` int(11) NOT NULL,
  `available` tinyint(1) NOT NULL,
  `cid` int(11) DEFAULT NULL,
  PRIMARY KEY (`number`),
);
4

2 に答える 2

0

これが良い解決策かどうかはわかりませんが、最終的には次のようにしました。

SELECT number, room.price
FROM rooms
JOIN room on room.rid = rooms.type 
WHERE rooms.type = ".$room_id."
AND rooms.number NOT IN (
    SELECT number FROM reservation
    WHERE end >= FROM_UNIXTIME(".$start.")
    AND begin <= FROM_UNIXTIME(".$end.")
) LIMIT 1;
于 2012-05-16T06:05:11.863 に答える
0

あなたが持っているものとまったく同じテーブル構造ではありませんが、ここに予約クエリへの別のリンクがあります...方法/理由を確認できますが、探しているものを取得しても問題ありません...

SELECT DISTINCT        
      rooms.number
   FROM        
      rooms
         LEFT JOIN reservations res
            ON rooms.number = res.number
           AND (  res.begin between '2012-04-05' and '2012-04-08'                
               OR res.end between '2012-04-05' and '2012-04-08' )
   WHERE          
          rooms.type = 4
      AND res.number IS NULL   

前提は、各部屋を見て、問題の日付内の予約を具体的に探すことです. いずれかの予約または終了日が範囲内にある場合、その予約は占有されています。そうでない場合は、予約なしで利用できます。そのため、LEFT JOIN は常に部屋を返すことを許可します (指定されたタイプ = 4) が、予約テーブル番号の値が NULL である場合にのみ、ファイルに予約がないこと、レコードがないこと、null の一致を示します... 部屋は IS です利用可能。

于 2012-05-16T03:33:54.007 に答える