1

バックグラウンド...

データベースにクエリを実行して、特定の日付範囲で利用可能な賃貸物件を確認しようとしています。保存方法がひどいですが、デスクトップ プログラムで作成されています :/ Web サイトは Wordpress で作成されていますが、手動でデータベースにクエリを実行しても正しい結果が得られません。

問題... データベースには 、 、 の 3 つの列がpropidありav_dateますavail。5 月 31 日から 6 月 8 日に予約された物件がありますが、その間は毎日利用できます。テーブルのデータを表示すると、次のようになります。

propid   av_date     avail

1051     2013-05-31  U
1051     2013-06-01  A
1051     2013-06-02  A
1051     2013-06-03  A
1051     2013-06-04  A
1051     2013-06-05  A
1051     2013-06-06  A
1051     2013-06-07  A
1051     2013-06-08  U

次のクエリを実行すると、プロパティがまだ表示されます...

SELECT DISTINCT propid
FROM availabilities
WHERE avail = 'A'
AND av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08');

私はこれについて2日間壁に頭をぶつけてきたので、おそらくばかげたことですが、どんな助けも大歓迎です!

4

4 に答える 4

1

日付範囲にがあるプロパティを完全に除外する場合は、avail = 'U'の出現回数を数え、U少なくとも 1 つあるを除外してみてUください。

SELECT propid
FROM availabilities
WHERE av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08')
GROUP BY propid
HAVING COUNT(CASE WHEN avail = 'U' THEN 1 END) = 0

最後に、 で日付の範囲を使用できますBETWEEN。これにより、クエリが短くなり、保守が容易になります。

SELECT propid
FROM availabilities
WHERE av_date BETWEEN '2013-05-31' AND '2013-06-08'
GROUP BY propid
HAVING COUNT(CASE WHEN avail = 'U' THEN 1 END) = 0
于 2013-05-29T18:43:02.417 に答える
0

NOT EXISTS を使用して、利用できない propid を除外できます。

SELECT DISTINCT a.propid 
FROM availabilities a
WHERE NOT EXISTS
( SELECT 1
FROM availabilities b
WHERE b.avail = 'U' 
AND b.propid = a.propid 
AND b.av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08');
)

サブクエリには、空室状況の値に基づく条件を含めることができます。

于 2013-05-29T18:40:11.760 に答える