2016-03-15 5 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_count и min_val. .

И я написал те в подзапросе ..

Здесь я должен проверять состояние WHERE min_val IS NOT NULL домена .ru; если 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» в «where clause» для меня –

+0

Обновлено. попробуй еще раз. –

1

Ваш запрос является чрезмерно сложным и может быть значительно упрощена:

  • Две коррелированные подзапросы точно так же, за исключением SELECT (MIN против 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) 

три части этого условия означают:

  • Бронирование этого номера в будущем и не пересекается с этой недели;
  • Бронирование в этом номере в прошлом, номер бесплатный сегодня не позднее;
  • В комнате нет известного бронирования.

Во всех трех случаях номер доступен для бронирования на интересующую неделю.

+0

Какое имя таблицы я должен указывать здесь ... Поскольку результаты извлекаются из двух таблиц 'abserve_hotels' и' abserve_hotel_rooms' –

+0

Большое спасибо @trincot, но я следую за Dylan Su..And, это работает для меня отлично ... Еще раз Спасибо вы за свой мгновенный ответ :) –

+0

Добро пожаловать. Когда у вас есть время, я все равно просмотрю ваш текущий запрос, поскольку он не является необходимым сложным и, следовательно, сложнее поддерживать. – trincot

Смежные вопросы