如果具有空值,如何为子查询别名编写条件

How to write condition for subquery alias if having null value

这是我的查询,

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"

它总共 return 我的 table abserve_hotels 中的一列值,即 hotel_id 以及额外的两个别名列,例如 avail_room_countmin_val..

我在子查询中写了那些..

这里我必须检查一个条件 WHERE min_val IS NOT NULL .i.e;如果 min_val 具有 NULL 值,我必须对其进行限制

我该怎么做..

这是我的 table

hotel_id  avail_room_count  min_val   

1             0                NULL
2             0                NULL

这里我需要限制这些NULL值..

有人请帮助我..

在末尾添加一个 HAVING 子句:

HAVING min_val IS NOT NULL

WHERE 之后的新查询如下所示:

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

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

  • 除了SELECT列表(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

因为 INNER JOIN 需要至少匹配一次,所以您已经可以确定 min_val 永远不会是 NULL

可用性检查非常简单:

           (   rm.check_in_time  >= '2016-03-22' 
            OR rm.check_out_time <= '2016-03-15'
            OR rm.check_in_time IS NULL) 

该条件的三个部分表示:

  • 此房间的预订是未来的,与本周不重叠;
  • 此房间已预订,最迟今天有空;
  • 房间没有已知的预订。

在所有三种情况下,相关周的房间都可以预订。