2016-03-15 21 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

相關問題