返回错误结果的mysql查询

返回错误结果的mysql查询,mysql,Mysql,背景 我正试图查询数据库,看看在给定的日期范围内我们有哪些出租房。存储方法很糟糕,但它是由桌面程序创建的:/ 该网站是用Wordpress编写的,但即使我手动查询数据库,也无法得到正确的结果 问题是。。。 数据库中有3列:propid、avu date和avail。我有一处房产在5月31日和6月8日预订,但在这两天之间每天都有空房。当我查看表中的数据时,如下所示: propid av_date avail 1051 2013-05-31 U 1051 2013-0

背景

我正试图查询数据库,看看在给定的日期范围内我们有哪些出租房。存储方法很糟糕,但它是由桌面程序创建的:/ 该网站是用Wordpress编写的,但即使我手动查询数据库,也无法得到正确的结果

问题是。。。 数据库中有3列:
propid
avu 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');
我已经为这件事头痛了两天了,所以这可能是件愚蠢的事,但是任何帮助都将不胜感激

试试看:

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');
尝试:


您可以使用“不存在”排除任何不可用的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');
)

子查询可以包括基于availabilities a中的值的条件。

您可以使用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');
)

子查询可以包含基于availabilities a中的值的条件。

如果要完全排除日期范围中具有
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
最后,您可以使用介于之间的日期范围,这使得查询更短,更易于维护:

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

如果要完全排除日期范围内有
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
最后,您可以使用介于之间的日期范围,这使得查询更短,更易于维护:

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

您的查询正在查找任何日期可用的属性。要获取所有日期,您需要一个集合内的集合问题。我发现最好的方法是使用
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

9
是集合中的日期数。

您的查询正在查找任何日期可用的属性。要获取所有日期,您需要一个集合内的集合问题。我发现最好的方法是使用
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

9
是您设定的日期数。

您的预期结果是什么?“(..)中的AVU日期”只需点击一次即可通过为真。这就是问题所在。你所说的“财产还在出现”是什么意思?我希望您的查询能够获得日期列表中
avail='A'
avu date
所在的所有行。对于示例数据,这恰好是所有带有
avail='A'
的行。你想要什么结果?你期望的结果是什么?“(..)中的av_date”只需要点击一次就可以通过为真。这就是问题所在。你所说的“财产还在出现”是什么意思?我希望您的查询能够获得日期列表中
avail='A'
avu date
所在的所有行。对于示例数据,这恰好是所有带有
avail='A'
的行。您想要什么结果?
使用单个字段选择distinct
,在功能上与该字段上的常规查询分组相同。除了语法之外,您没有做任何更改。
select distinct
和单个字段在功能上与该字段上的常规查询分组相同。除了语法,你什么都没变。这就是我所缺少的!谢谢这就是我错过的!谢谢