Mysql 如果子查询别名的值为null,如何写入条件
我的问题是Mysql 如果子查询别名的值为null,如何写入条件,mysql,isnull,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
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"
这里我需要限制这些空值
有人请帮助我。在末尾添加HAVING子句:
HAVING min_val IS NOT NULL
WHERE后面的新查询如下所示:
WHERE
1 AND `city` = "madurai" AND `country` = "india"
HAVING min_val IS NOT NULL
在末尾添加HAVING子句:
HAVING min_val IS NOT NULL
WHERE后面的新查询如下所示:
WHERE
1 AND `city` = "madurai" AND `country` = "india"
HAVING min_val IS NOT NULL
您的查询过于复杂,可以大大简化: 除了SELECT list 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
该条件的三个部分表示:
此房间的预订是未来的,与本周不重叠;
这个房间的预订是过去的,最迟今天是免费的;
这个房间没有预定。
在这三种情况下,该房间都可以在相关的一周内预订。您的查询过于复杂,可以大大简化: 除了SELECT list 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
该条件的三个部分表示:
此房间的预订是未来的,与本周不重叠;
这个房间的预订是过去的,最迟今天是免费的;
这个房间没有预定。
在这三种情况下,房间都可以在相关的一周内预订。我已经尝试过这种方式,但是它显示了meI的“where子句”中的1054-未知列“min\u val”错误,已经尝试过这种方式,但是它显示了meRemove sql server标记的“where子句”中的1054-未知列“min\u val”错误,如果它与my-sql.Remove sql server标记相关,如果它与my-sql.What table name相关我应该在这里指定什么..由于结果是从两个表abserve_hotels和abserve_hotels_Rooms中检索的非常感谢@trincot,但我遵循Dylan Su..它对我很有用..再次感谢您的即时回复:不客气。当你有时间的时候,我仍然会检查你当前的查询,因为它是不必要的复杂,因此更难维护。我应该在这里指定什么表名..因为结果是从两个表abserve_hotels和abserve_hotels_Rooms中检索的非常感谢@trincot,但我遵循Dylan Su..这对我很有用..再次感谢您的即时回复:不客气。当您有时间时,我仍然会检查您当前的查询,因为它不必要而且复杂,因此更难维护。