1

背景...

我正在尝试查询数据库以查看我们在给定日期范围内可用的出租物业。存储方法很糟糕,但它是由桌面程序创建的:/ 该网站是用 Wordpress 编写的,但即使我手动查询数据库,我什至无法获得正确的结果。

问题... 数据库中有 3 列propidav_dateavail。我有一个在 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');

为此,我已经把头撞在墙上两天了,所以这可能是愚蠢的,但任何帮助将不胜感激!

4

4 回答 4

1

如果您想完全排除该属性(如果它avail = 'U'在日期范围内),请尝试计算出现次数U并忽略任何至少有一个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

您的查询正在查找在任何日期都可用的属性。要获取所有日期,您有一个 set-within-sets 问题。having我发现最好的方法是使用子句进行聚合。

SELECT propid
FROM availabilities
group by propid
having sum(case when 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') and
                     avail <> 'A'
                then 1
                else 0
           end) > 0

having子句计算条件成立的行数。如果有,则不包括该属性。您也可以这样处理:

SELECT propid
FROM availabilities
group by propid
having sum(case when 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') and
                     avail = 'A'
                then 1
                else 0
           end) = 9;

9是您的集合中的日期数。

于 2013-05-29T18:45:48.950 回答
0

尝试:

SELECT propid, avail, av_date
FROM availabilities
GROUP BY propid HAVING 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');
于 2013-05-29T18:36:10.030 回答
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');
)

子查询可以包括基于可用性值的条件 a.

于 2013-05-29T18:40:11.760 回答