0

SQL クエリでまた問題が発生しています...

D.0.02 は 1 日目の期間 1 に割り当てられているため、0 をカウントする必要があります。しかし、1 日目の期間 2 には割り当てられていません。0 として返されるのはなぜですか?

SELECT COUNT(DISTINCT rm.Id)
FROM ts_room rm LEFT JOIN ts_roompref rp ON rp.room_id = rm.id
  LEFT JOIN ts_request rq ON rq.id = rp.request_id
  LEFT JOIN ts_allocation a ON a.request_id = rq.id
WHERE room_id = "D.0.02"
  AND (a.status IS NULL OR a.status IN ('Pending', 'Failed', 'Declined'))
  AND (day_id=1 AND period_id=2)

これが私のフィドルです:http://sqlfiddle.com/#!2/5e1de/13

ステータスが Pending、Failed、Declined のいずれでもない場合、部屋は無視されますが、他の期間または日は空いている可能性がありますが、予約されていません。部屋は引き続き無料で予約できます。

SQL クエリを再入力する必要があるようです。方法に関するアドバイスはありますか?

4

3 に答える 3

2

Count() 一致する行がない場合でも、常に数値を返します。あなたの場合、一致する行はないので、count()はを返します0

編集:

選択すると、予約の数がカウントされます。0は、予約されていないことを意味します。

予約されていないときに1を返したい場合は、それを元に戻す必要があります。

SELECT 1 - COUNT(DISTINCT rm.Id) 
FROM ts_room rm LEFT JOIN ts_roompref rp ON rp.room_id = rm.id
  LEFT JOIN ts_request rq ON rq.id = rp.request_id
  LEFT JOIN ts_allocation a ON a.request_id = rq.id
WHERE room_id = "D.0.02"
  AND a.status = 'Allocated'
       AND day_id=1 AND period_id=2

たとえば、1日のすべての期間など、より広い検索を行う場合は、1を期間数(9)に変更して、空きスロットの数を返す必要があることに注意してください。

于 2013-02-19T10:31:22.590 に答える
0

問題は、dayIdとperiod_idがvarcharであり、数値として比較していることです。

クエリの最後の行を更新し、そのday_idとperiod_idのレコードを追加して、結果を取得できるようにします。

AND (day_id like "1" AND period_id like "2")

更新しました

 select 1- count(distinct rp.Id) from 
ts_roompref rp, ts_request rq, ts_allocation ta
where rp.room_id= "D.0.02" AND rq.id = rp.request_id and
ta.request_id = rq.id AND ta.status not in ("Pending", "Declined", "Failed")
AND day_id like "1" AND period_id like "5";

http://sqlfiddle.com/#!2/5e1de/187を確認 してください

お役に立てれば

于 2013-02-19T11:00:48.377 に答える
0

部屋の状況D.0.02 は です"Allocated"

a.status IN ('Pending', 'Failed', 'Declined')= 偽

a.status IS NULL= 偽

ステートメントの結果は にWHEREなりfalseます。

部屋が見つかりません。

于 2013-02-19T10:42:55.513 に答える