0

ここで他の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つの部屋タイプが利用できない場合は、ホテル全体を検索結果から削除する必要があります)。

4

2 に答える 2

2
IF(($q1) > 0, 1, 0)

これはエラーを返す部分です。

また、あなたがそれを持っている方法は、$q12回評価されていますが、それはおそらくあなたが望むものではありません。

私があなたがやろうとしていることを正しく理解していれば、あなたはこの部分を省くことができるはずです。$q1行を返さない場合、IN式はまったく何にも一致しません。

INサブクエリを使用することは、MySQLではかなり非効率的であることに注意する必要があります。結合するとはるかに高速に実行されます:

SELECT `c_title` FROM `c_content` JOIN ($q1) `a` ON `c_content`.`c_id`=`a`.`bd_h_id`
于 2011-02-23T13:29:26.393 に答える
0

エラーメッセージはIF(($q1) > 0, 1, 0)、クエリの最後にある句を参照しています。>サブクエリが複数の行を返す場合と比較することはできません。

于 2011-02-23T13:32:17.280 に答える