联盟所有日期条款

时间:2012-06-29 06:43:18

标签: 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)

附近获取语法错误

我的目标是获得包含日期和Avail超过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个表格都不明确。我有另一个领域Avail跟踪可用的房间数量。预订完成后,它会自动计算可用房间。

我当前的查询使用的房间类型选项只能为每个查询生成房间类型的可用性。有了上述内容,我计划进行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(日期)它给出了有4行的日期,但它仍然显示了Avail所属的房间类型的1行&gt; 0

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

1 个答案:

答案 0 :(得分: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

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