如果具有空值,如何为子查询别名编写条件
How to write condition for subquery alias if having null value
这是我的查询,
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"
它总共 return 我的 table abserve_hotels
中的一列值,即 hotel_id
以及额外的两个别名列,例如 avail_room_count
和 min_val
..
我在子查询中写了那些..
这里我必须检查一个条件 WHERE min_val IS NOT NULL
.i.e;如果 min_val
具有 NULL 值,我必须对其进行限制
我该怎么做..
这是我的 table
hotel_id avail_room_count min_val
1 0 NULL
2 0 NULL
这里我需要限制这些NULL值..
有人请帮助我..
在末尾添加一个 HAVING 子句:
HAVING min_val IS NOT NULL
WHERE 之后的新查询如下所示:
WHERE
1 AND `city` = "madurai" AND `country` = "india"
HAVING min_val IS NOT NULL
您的查询过于复杂,可以大大简化:
- 除了
SELECT
列表(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
因为 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)
该条件的三个部分表示:
- 此房间的预订是未来的,与本周不重叠;
- 此房间已预订,最迟今天有空;
- 房间没有已知的预订。
在所有三种情况下,相关周的房间都可以预订。
这是我的查询,
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"
它总共 return 我的 table abserve_hotels
中的一列值,即 hotel_id
以及额外的两个别名列,例如 avail_room_count
和 min_val
..
我在子查询中写了那些..
这里我必须检查一个条件 WHERE min_val IS NOT NULL
.i.e;如果 min_val
具有 NULL 值,我必须对其进行限制
我该怎么做..
这是我的 table
hotel_id avail_room_count min_val
1 0 NULL
2 0 NULL
这里我需要限制这些NULL值..
有人请帮助我..
在末尾添加一个 HAVING 子句:
HAVING min_val IS NOT NULL
WHERE 之后的新查询如下所示:
WHERE
1 AND `city` = "madurai" AND `country` = "india"
HAVING min_val IS NOT NULL
您的查询过于复杂,可以大大简化:
- 除了
SELECT
列表(MIN
vsCOUNT
)之外,这两个相关子查询完全相同,因此可以将它们合并为一个; - 子查询做的聚合可以在主查询中做;
- 检查可用性的条件可以写得更短。
事实上,您可以通过以下查询完成所有需要的操作:
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)
该条件的三个部分表示:
- 此房间的预订是未来的,与本周不重叠;
- 此房间已预订,最迟今天有空;
- 房间没有已知的预订。
在所有三种情况下,相关周的房间都可以预订。