4

こんにちは、私は 2 つのテーブルの部屋と予約を持っていますが、私のテーブルの構造は少し異なります。予約テーブルには、roomid、date、status などがあります。

101,2012-12-10,0
101,2012-12-11,0
101,2012-12-12,1
101,2012-12-13,0
102,2012-12-10,0
102,2012-12-11,0
102,2012-12-12,0

2012 年 12 月 10 日から 2012 年 12 月 13 日までの間に利用可能な部屋を探したいのですが、このリクエストに従って部屋 102 のみを返却する必要があります。

私はもう試した

SELECT id 
FROM status 
WHERE status='0' 
  AND date between '2012-12-10' AND '2012-12-13' 
GROUP BY id

使用可能な行が 1 つしか見つからない場合でも、101 に対して true を返すため、機能しません。

そのため、101 は 2012 年 12 月 11 日に利用可能であり、利用可能のように表示されますが、データ範囲には問題ありません。

4

6 に答える 6

1

日付に時刻が関連付けられている場合は、次のようにする必要があります。

SELECT id 
FROM status 
WHERE status='0' 
  AND date between '2012-12-10 00:00:00' AND '2012-12-13 23:59:59' 
GROUP BY id

時間を含める代わりにDate(date)を使用することもできますが、これは効率が低下する可能性があります。

于 2012-12-20T18:34:17.057 に答える
1

次のものを使用できるはずです。

SELECT roomid 
FROM status s1
WHERE status='0' 
  AND date between '2012-12-10' AND '2012-12-13' 
  and not exists (select roomid
                  from status  s2
                  where status='1' 
                    AND date between '2012-12-10' AND '2012-12-13'
                    and s1.roomid = s2.roomid)
GROUP BY roomid

デモ付きのSQLフィドルを参照してください

于 2012-12-20T18:35:36.170 に答える
1

status=1これにより、選択した間隔で行がないすべての部屋が選択されます。私が使用していないことに注意してくださいbetweenstatus=112月13日に部屋がまだその間隔で利用可能である場合、それが私が使用している理由です>= and <

SELECT roomid
FROM status
WHERE `date` >= '2012-12-10'
      AND `date` < '2012-12-13'
GROUP BY roomid
HAVING sum(status.status=1)=0

テーブルに行方不明の日もある可能性があり、それが部屋が予約されていないが利用できないことを意味する場合は、次のクエリを使用することもできます。

SELECT roomid
FROM status
WHERE `date` >= '2012-12-10'
      AND `date` < '2012-12-13'
      AND status=0
GROUP BY roomid
HAVING count(*)=DATEDIFF('2012-12-13', '2012-12-10')

これは、間隔の日数がstatus=0の行数と等しいことを確認します。

于 2012-12-20T18:39:07.813 に答える
1

これを試して:

SELECT rd.* 
FROM room_details rd 
INNER JOIN (SELECT DISTINCT roomid FROM bookings 
            WHERE roomid NOT IN (SELECT roomid FROM bookings 
                                WHERE STATUS =0 AND DATE BETWEEN '2012-12-10' AND '2012-12-13')
                ) AS a ON rd.roomid = a.roomid
于 2012-12-20T18:38:09.920 に答える
0

SQL BETWEEN 条件は、expression が value1 と value2 (両端を含む) の範囲内にあるレコードを返します。したがって101,2012-12-10,0、上記のクエリに対して行が返される必要があります。

于 2012-12-20T18:43:03.900 に答える
0

これを試して:

SELECT roomid
FROM status
WHERE 'date_from' <= "2012-12-10"  AND 'date_to' > "2012-12-10" AND 'status'= 0;
于 2015-06-30T09:28:42.720 に答える