mysql - Union all where 日期子句

标签 mysql sql sql-order-by union-all having-clause

我的查询

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 年 6 月 29 日的高级和豪华表中可用 = 0,对于 super 豪华,所有日期都是可用

在这种情况下,我的结果应该只将 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 个表都是模棱两可的。我有另一个 Avail 字段,它跟踪可用房间的数量。预订完成后,它会自动计算可用房间。

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

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

最佳答案

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

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

关于mysql - Union all where 日期子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11257211/

相关文章:

MySQL:对行组合设置唯一限制的问题

sql - 从由其他列聚合并选择最大日期的列中获取任何值

sql - Oracle SUM 返回错误的摘要,其中包含从 SELECT UNION 返回的相同值

php - 发送 : How to fetch record from Database without considering case sensitive?

php - Require_once 跨不同文件,全局作用域

SQL 查询每隔几天就会变慢

mysql - 按开始和/或结束日期对 MySQL 中的事件进行排序

php - 使用 ORDER BY 加入两个 sql 查询

SQL Server 排序时间最近,然后最接近

PHP 与 SQL 通配符搜索