Mysql 如果子查询别名的值为null,如何写入条件

Mysql 如果子查询别名的值为null,如何写入条件,mysql,isnull,Mysql,Isnull,我的问题是 SELECT `h`.`hotel_id`, ( SELECT COUNT(room_id) FROM `abserve_hotel_rooms` AS `rm` WHERE `rm`.`adults_count` >= "1" AND `rm`.`room_count` >= "1" AND "Available" = IF( check_in_time = '2016-03-15', 'Unavailable

我的问题是

SELECT
  `h`.`hotel_id`,
  (
  SELECT COUNT(room_id)
  FROM
    `abserve_hotel_rooms` AS `rm`
  WHERE
    `rm`.`adults_count` >= "1" AND `rm`.`room_count` >= "1" AND "Available" = IF(
      check_in_time = '2016-03-15',
      'Unavailable',
      (
        IF(
          '2016-03-15' > check_in_time,
          (
            IF(
              '2016-03-15' < check_out_time,
              'Unavailable',
              'Available'
            )
          ),
          (
            IF(
              '2016-03-22' > check_in_time,
              'Unavailable',
              'Available'
            )
          )
        )
      )
    ) AND `room_prize` BETWEEN '174' AND '600' AND `rm`.`hotel_id` = `h`.`hotel_id`
) AS `avail_room_count`,
(
SELECT MIN(room_prize)
FROM
  `abserve_hotel_rooms` AS `rm`
WHERE
  `rm`.`adults_count` >= "1" AND `rm`.`room_count` >= "1" AND "Available" = IF(
    check_in_time = '2016-03-15',
    'Unavailable',
    (
      IF(
        '2016-03-15' > check_in_time,
        (
          IF(
            '2016-03-15' < check_out_time,
            'Unavailable',
            'Available'
          )
        ),
        (
          IF(
            '2016-03-22' > check_in_time,
            'Unavailable',
            'Available'
          )
        )
      )
    )
  ) AND `room_prize` BETWEEN '174' AND '600' AND `rm`.`hotel_id` = `h`.`hotel_id`
) AS `min_val`
FROM
  `abserve_hotels` AS `h`
WHERE
  1 AND `city` = "madurai" AND `country` = "india"
这里我需要限制这些空值


有人请帮助我。

在末尾添加HAVING子句:

HAVING min_val IS NOT NULL
WHERE后面的新查询如下所示:

WHERE
  1 AND `city` = "madurai" AND `country` = "india"
HAVING min_val IS NOT NULL

在末尾添加HAVING子句:

HAVING min_val IS NOT NULL
WHERE后面的新查询如下所示:

WHERE
  1 AND `city` = "madurai" AND `country` = "india"
HAVING min_val IS NOT NULL

您的查询过于复杂,可以大大简化:

除了SELECT list MIN VS COUNT外,这两个相关子查询完全相同,因此可以将它们组合成一个查询; 子查询的聚合可以在主查询中完成; 检查可用性的条件可以写得更短。 事实上,您可以通过以下查询完成所有需要的操作:

SELECT     h.hotel_id,
           COUNT(rm.room_id) as avail_room_count, 
           MIN(rm.room_prize) AS min_val
FROM       abserve_hotels AS h
INNER JOIN abserve_hotel_rooms AS rm
       ON  rm.hotel_id = h.hotel_id
WHERE      h.city = "madurai"
       AND h.country = "india"
       AND rm.adults_count >= 1 
       AND rm.room_count >= 1
       AND rm.room_prize BETWEEN 174 AND 600
       AND (   rm.check_in_time  >= '2016-03-22' 
            OR rm.check_out_time <= '2016-03-15'
            OR rm.check_in_time IS NULL) 
GROUP BY   h.hotel_id
该条件的三个部分表示:

此房间的预订是未来的,与本周不重叠; 这个房间的预订是过去的,最迟今天是免费的; 这个房间没有预定。
在这三种情况下,该房间都可以在相关的一周内预订。

您的查询过于复杂,可以大大简化:

除了SELECT list MIN VS COUNT外,这两个相关子查询完全相同,因此可以将它们组合成一个查询; 子查询的聚合可以在主查询中完成; 检查可用性的条件可以写得更短。 事实上,您可以通过以下查询完成所有需要的操作:

SELECT     h.hotel_id,
           COUNT(rm.room_id) as avail_room_count, 
           MIN(rm.room_prize) AS min_val
FROM       abserve_hotels AS h
INNER JOIN abserve_hotel_rooms AS rm
       ON  rm.hotel_id = h.hotel_id
WHERE      h.city = "madurai"
       AND h.country = "india"
       AND rm.adults_count >= 1 
       AND rm.room_count >= 1
       AND rm.room_prize BETWEEN 174 AND 600
       AND (   rm.check_in_time  >= '2016-03-22' 
            OR rm.check_out_time <= '2016-03-15'
            OR rm.check_in_time IS NULL) 
GROUP BY   h.hotel_id
该条件的三个部分表示:

此房间的预订是未来的,与本周不重叠; 这个房间的预订是过去的,最迟今天是免费的; 这个房间没有预定。
在这三种情况下,房间都可以在相关的一周内预订。

我已经尝试过这种方式,但是它显示了meI的“where子句”中的1054-未知列“min\u val”错误,已经尝试过这种方式,但是它显示了meRemove sql server标记的“where子句”中的1054-未知列“min\u val”错误,如果它与my-sql.Remove sql server标记相关,如果它与my-sql.What table name相关我应该在这里指定什么..由于结果是从两个表abserve_hotels和abserve_hotels_Rooms中检索的非常感谢@trincot,但我遵循Dylan Su..它对我很有用..再次感谢您的即时回复:不客气。当你有时间的时候,我仍然会检查你当前的查询,因为它是不必要的复杂,因此更难维护。我应该在这里指定什么表名..因为结果是从两个表abserve_hotels和abserve_hotels_Rooms中检索的非常感谢@trincot,但我遵循Dylan Su..这对我很有用..再次感谢您的即时回复:不客气。当您有时间时,我仍然会检查您当前的查询,因为它不必要而且复杂,因此更难维护。