【问题标题】:Mysql - Select rooms where have all the datesMysql - 选择有所有日期的房间
【发布时间】:2018-06-07 09:40:37
【问题描述】:

您好,我在这样的表中有空房:

房间号 |日期 1 | 2018-06-09 00:00:00 1 | 2018-06-10 00:00:00 1 | 2018-06-11 00:00:00 2 | 2018-06-09 00:00:00 2 | 2018-06-11 00:00:00 3 | 2018-06-09 00:00:00 4 | 2018-06-07 00:00:00 ...

我发送了一组日期,我想知道任何房间是否全天都有空房:

SELECT rtd.room_id, CASE WHEN Count(rtd.room_id) < 2 THEN 'no' ELSE 'yes' END
FROM room_type_day as rtd
WHERE 
rtd.date IN ('2018-06-09 00:00:00', '2018-06-10 00:00:00', '2018-06-11 00:00:00')
GROUP BY rtd.room_type_id

但这让我回过神来:

1 |是的 2 |是的 3 |是的 4 |不

如何找到全天都有的房间?

谢谢。

编辑

如果我在“分组依据”之前添加 HAVING(COUNT DISTINCT rtd.date) = 3",则会收到以下错误:

编辑

这对我有用:

SELECT `room_id`
FROM `room_type_day`
WHERE `date` IN ('2018-06-09', '2018-06-10', '2018-06-11')
GROUP BY `room_id`
HAVING COUNT(`room_id`) = 3;

但是如果有一个或多个房间可用,我该如何修改这个查询,返回“yes”,如果没有,返回“no”?

谢谢

【问题讨论】:

  • 提示:HAVING 子句。
  • 添加HAVING(COUNT DISTINCT rtd.date) = 3
  • 或者换一种思考方式......你能找到在任何日子都没有空房的房间吗? (TB 的解决方案可能过于繁琐)
  • 请问你能写出所有的sql吗?如果我在“group by”之前添加“HAVING(COUNT DISTINCT rtd.date) = 3”,则会出现语法错误
  • HAVING 子句将删除答案为“否”的房间。

标签: mysql sql database date


【解决方案1】:

使用GROUP BYHAVING 子句。

查询

SELECT `room_id`
FROM `room_type_day`
WHERE `date` IN ('2018-06-09', '2018-06-10', '2018-06-11')
GROUP BY `room_id`
HAVING COUNT(`room_id`) = 3;

Find SQL Fiddle here

【讨论】:

  • 这将删除答案为“否”的房间,并且不同的子句也应该在那里
  • @Dataichou : 3 天内只有 room_id 1 可用。
  • 我同意这是一个有效的答案。我会添加 DISTINCT 只是因为我不知道是否可能有重复。我也在尝试遵循他/她最初的预期输出格式
  • 谢谢@Wanderer,这对我有用。但是如果有一个或多个房间可用,我该如何修改这个查询,返回“是”,如果没有人返回“否”?
【解决方案2】:

像这样尝试并确保 days_= 'IN' 语句中的天数

    SELECT room_id, CASE WHEN days_=3 THEN 'yes' ELSE 'No' END) as availability
    FROM
    (
      SELECT rtd.room_id, Count(distinct rtd.room_id)  as days_
      FROM room_type_day as rtd
      WHERE rtd.date IN ('2018-06-09 00:00:00', '2018-06-10 00:00:00', '2018-06-11 00:00:00')
      GROUP BY rtd.room_type_id
     ) as sub

【讨论】:

    【解决方案3】:

    您正在按表中未找到的列进行分组。

    SELECT 
       A.room_id, 
       IF(A.count=A.count_in_range,'Yes','No') status
    FROM 
    (SELECT 
       room_id, 
       COUNT(*) count, 
       SUM(IF(date IN ('2018-06-09 00:00:00', '2018-06-10 00:00:00', 
                       '2018-06-11 00:00:00'),1,0)) count_in_range
    FROM room_type_day
    GROUP BY room_id) A;
    

    Demo on SQL Fiddle

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多