mysql查询返回错误的结果

时间:2013-05-29 18:27:37

标签: mysql

...背景

我正在尝试查询数据库,以查看我们在给定日期范围内可用的租赁属性。存储方法很糟糕,但它是由桌面程序创建的:/ 该网站是用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');

我一直在墙上撞墙2天,所以这可能是愚蠢的,但任何帮助都会非常感激!

4 个答案:

答案 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

排除任何不可用的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的值的条件。

答案 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是您设置中的日期数。