ここで他のmysql可用性クエリの質問のいくつかを見てきたので、これまでのところ私は得ていますが、私の動作方法は他のものとは少し異なります。
基本的に私は日付のテーブルを持っており、各日付は行です。各行には、費用、部屋のタイプ、およびその日に予約する必要がある日数を示すフィールドが含まれています。したがって、ホテルの部屋タイプが1つである場合、365行になり、5つの部屋タイプである場合、1825行になります。
bd_id int(10) NO PRI NULL auto_increment
bd_room_type varchar(32)
bd_date date NO
bd_price decimal(8,2)
bd_h_id int(8) NO /* Hotel id */
bd_available tinyint(1) /* number of days you must book to include this date */
開始日と終了日を取得し、その間のギャップを埋めて、予約のすべての日付を取得します。
$q1 = "SELECT bd_h_id
FROM booking_dates
WHERE bd_date IN ('2011-02-16','2011-02-17','2011-02-18')
AND bd_available <= '3'
AND bd_room_type = 'single'
AND bd_price > '0'
GROUP BY bd_h_id
HAVING count(*) = '3'";
したがって、カウントが期間と同じである場合は、すべての依存関係が満たされていることを意味し、検索結果を表示できます。
次に、そのクエリを変数として別のクエリに渡します。このクエリはホテル情報を抽出し、サブクエリが何かを返しているかどうかを確認します。
$q = "SELECT c_title FROM c_content WHERE c_id IN ($q1) AND IF(($q1) > 0, 1, 0)";
これは問題ありませんが、サブクエリが複数のホテルを返す場合、メインクエリはエラーを表示します。
サブクエリは複数の行を返します
「IN」を使ったので大丈夫だと思いました。助言がありますか?また、複数のサブクエリを実装する場合、ソリューションはそれでも機能する必要があります。
私は部屋のやり方がそれほどエレガントではないことを知っていますが、予約は通常一括予約であるため、必要な結果を達成するために他にどのようにすればよいかわかりません(たとえば、提供された期間中に1つの部屋タイプが利用できない場合は、ホテル全体を検索結果から削除する必要があります)。