2016-03-15 19 views
0

在这里写下条件的子查询别名是我的查询,如何,如果有空值

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 .IE;如果有NULL值min_val我一定要限制它

我怎样才能做到这一点..

这是我的表

hotel_id avail_room_count min_val 

1    0    NULL 
2    0    NULL 

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

有人请帮我..

+0

删除'sql-server'标记,如果它与my-sql相关。 –

回答

1

在最后加个HAVING子句:

HAVING min_val IS NOT NULL 

后WHERE看起来像新的查询:

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

我已经尝试过这种方式,但它显示'#1054 - '我的子句'错误中的未知列'min_val' –

+0

已更新。再试一次。 –

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) 

该条件均值的三个部分:

  • 这间客房的预订是未来的,不与这周重叠;
  • 这个房间的预订是过去的,最晚的房间是免费的;
  • 房间里没有已知的预订。

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

+0

我应该在这里指定什么样的表名称。因为结果是从两个表格'abserve_hotels'和'abserve_hotel_rooms'中检索的 –

+0

非常感谢你@trincot,但是我遵循了Dylan Su ..并且它对我很好用。再次感谢你为你的即时回复:) –

+0

不客气。当你有一段时间时,我仍然会检查你当前的查询,因为它不必要的复杂,因此难以维护。 – trincot

相关问题