联合所有 where 日期子句

Posted

技术标签:

【中文标题】联合所有 where 日期子句【英文标题】:Union all where date clause 【发布时间】:2012-06-29 06:43:17 【问题描述】:

我的查询

SELECT RoomType, date FROM Superior WHERE (date >= '2012-06-26'AND date < '2012-06-30')AND (Avail > '0')
UNION
SELECT RoomType, date FROM Deluxe WHERE (date >= '2012-06-26'AND date < '2012-06-30')AND (Avail > '0')
UNION
SELECT RoomType, date FROM SuperDeluxe WHERE (date >= '2012-06-26'AND date < '2012-06-30')AND (Avail > '0')
ORDER BY date
HAVING COUNT(date, INTERVAL 3 DAY) 

在'HAVING COUNT(date, INTERVAL 3 DAY)附近出现语法错误

我的目标是获取日期和可用时间超过 3 天的房间类型的结果

** 在 2012-06-29 日期的高级和豪华表中,Avail=0,对于 SuperDeluxe,所有日期均为 Avail

在这种情况下,我的结果应该只显示 SuperDeluxe 作为可用性,但是

**RoomType**    **date**
Superior        2012-06-26
Superior        2012-06-27
Superior        2012-06-28
Deluxe          2012-06-26
Deluxe          2012-06-27
Deluxe          2012-06-28
SuperDeluxe     2012-06-26
SuperDeluxe     2012-06-27
SuperDeluxe     2012-06-28
SuperDeluxe     2012-06-29

是的,它是 mysql,我只是想向自己证明,我可以帮助我的叔叔完成这项工作。如你所知,我不是一个季节性的,只是一个初学者。你猜对了,所有 3 个表都是模棱两可的。我有另一个字段可用,它跟踪可用房间的数量。预订完成后,它会自动计算可用房间。

我当前的查询正在使用房间类型的选项选择,它只能为每个查询生成房间类型的可用性。有了以上内容,我计划进行 1 次查询并生成日期范围内可用的任何房间类型。使用上述联合查询时遇到的问题,我得到的结果还包括可用性为 = 0 的范围内的日期之一

我正在尝试这样的事情

SELECT RoomType, COUNT( date )
FROM Superior
WHERE date >= '2012-06-26'
  AND date < '2012-06-30'
  AND Avail > '0'
UNION
SELECT RoomType, COUNT( date )
FROM Deluxe
WHERE date >= '2012-06-26'
  AND date < '2012-06-30'
  AND Avail > '0'
UNION
SELECT RoomType, COUNT( date )
FROM SuperDeluxe
WHERE date >= '2012-06-26'
  AND date < '2012-06-30'
  AND Avail > '0'
GROUP BY date
HAVING COUNT( 4 )

看起来我越来越近了。我尝试了 MAX( date ) 它给出了有 4 行的日期,但它仍然显示 1 行 Avail > 0 的房间类型

我也试过 HAVING COUNT(DISTINCT date) =4 结果仍显示字段日期,行数不等于 4

【问题讨论】:

您使用的是什么数据库产品? MySQL?此外,这种属性拆分的气味 - 为什么有 3 个看似相同的表?为什么不只是一张桌子,另外一列指定高级、豪华或超级豪华? 向我们展示表定义和示例数据。什么是Availability,0 或 1 标志?它是描述可用天数的整数吗? 由于您在 3 个选择中的每一个中都有一个 where 子句,因此只需删除 HAVING 语句。 【参考方案1】:

HAVING 仅适用于 GROUP BY(用于过滤组),但您没有组在使用。

您需要在每个选择中使用简单的WHERE 子句,并且您可以订购一个包装选择:

select * from (
    SELECT RoomType, date 
    FROM Superior
    WHERE date >= '2012-06-26' 
    AND date < '2012-06-30'
    AND Avail > 3 -- specify avail range here
  UNION
    SELECT RoomType, date
    FROM Deluxe
    WHERE date >= '2012-06-26' 
    AND date < '2012-06-30'
    AND Avail > 3 -- specify avail range here
  UNION
    SELECT RoomType, date
    FROM SuperDeluxe
    WHERE date >= '2012-06-26' 
    AND date < '2012-06-30'
    AND Avail > 3 -- specify avail range here
) results
ORDER BY date

我会认真考虑将数据合并到一个表中并添加一列来区分三种预订类型,而不是使用更多表。它不仅会使您的查询更加合理,而且当您获得新的预订类型时,您不必创建另一个表。

【讨论】:

不确定这是否能解决问题,因为规格相当模糊,但似乎方向正确。不过,您不需要将此查询包装在嵌套子查询中。

以上是关于联合所有 where 日期子句的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:有效地使用where子句过滤时间戳列以获取特定日期的所有记录

在WHERE子句中选择最小日期

带有WHERE子句逻辑的SQL Server存储过程

查询 eloquent where 子句中的所有值

SQL / Postgres join where子句

Laravel 查询不使用 where 子句作为日期