...背景
我正在尝试查询数据库,以查看我们在给定日期范围内可用的租赁属性。存储方法很糟糕,但它是由桌面程序创建的:/ 该网站是用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天,所以这可能是愚蠢的,但任何帮助都会非常感激!
答案 0 :(得分:1)
如果要在日期范围内有avail = 'U'
的情况下完全排除该属性,请尝试计算U
的出现次数并省略至少有U
的任何属性:< / p>
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
答案 1 :(得分: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');
答案 2 :(得分:0)
您可以使用NOT EXISTS
排除任何不可用的propidSELECT 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的值的条件。
答案 3 :(得分: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
是您设置中的日期数。