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

时间:2016-03-15 11:16:52

标签: 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',
      (
        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"

它完全返回我的表abserve_hotels中的一个列值hotel_id,其中包含额外的两个别名列,例如avail_room_countmin_val ..

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

在这里,我必须检查条件WHERE min_val IS NOT NULL .i.e;如果min_val具有NULL值,我必须限制它

我该怎么做..

这是我的表

hotel_id  avail_room_count  min_val   

1             0                NULL
2             0                NULL

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

有人请帮帮我..

2 个答案:

答案 0 :(得分:1)

在最后添加一个HAVING子句:

HAVING min_val IS NOT NULL

WHERE之后的新查询如下:

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

答案 1 :(得分:1)

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

  • 除了SELECT列表(MINCOUNT)之外,两个相关的子查询完全相同,因此它们可以合并为一个;
  • 子查询完成的聚合可以在主查询中完成;
  • 检查可用性的条件可以写得更短。

事实上,您可以使用以下查询完成所需的所有操作:

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) 

该条件的三个部分意味着:

  • 这个房间的预订是未来,并且与本周不重叠;
  • 这个房间的预订已经过去了,房间最迟是免费的;
  • 房间没有已知的预订。

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