MySQL函数问题:如何用HAVING子句筛选匹配卧室数的最低价房源
修复MySQL函数
cheapest_property_with_n_bedrooms的问题 原代码的核心问题
- HAVING子句语法错误:
AND MIN(Listing.price)缺少比较操作符(比如与某个值的判断),这直接导致查询无法返回有效结果。 - GROUP BY逻辑错误:按
Amenities.num_bedrooms分组会将所有同卧室数的房源合并为一组,无法定位到单个房源,应该按房源ID分组来计算每个房源的最低挂牌价。 - 冗余变量:声明的
bedrooms变量未被使用,可直接删除。
修正后的函数代码
DELIMITER $$ DROP FUNCTION IF EXISTS cheapest_property_with_n_bedrooms $$ CREATE FUNCTION cheapest_property_with_n_bedrooms (numBedrooms INT) RETURNS INT DETERMINISTIC BEGIN DECLARE PropertyID INT; -- 筛选对应卧室数的房源,计算每个房源的最低挂牌价,取价格最低的房源ID SET PropertyID = ( SELECT p.property_id FROM Property p JOIN Listing l ON l.property_FK = p.property_id JOIN Amenities a ON a.property_FK = p.property_id WHERE a.num_bedrooms = numBedrooms GROUP BY p.property_id ORDER BY MIN(l.price) ASC, p.property_id DESC LIMIT 1 ); RETURN PropertyID; END$$ DELIMITER ;
代码说明
- WHERE子句过滤卧室数:在分组前直接筛选对应卧室数的房源,比HAVING分组后过滤更高效。
- 按房源ID分组:确保每个分组对应单个房源,精准计算该房源的最低挂牌价
MIN(l.price)。 - 排序逻辑:先按最低价格升序排序,第一条即为价格最低的房源;若存在价格相同的房源,按房源ID降序取第一个。
- LIMIT 1:直接获取排序后的第一条结果,得到目标房源ID。
内容的提问来源于stack exchange,提问作者Peter Lee
相关产品推荐
相关产品推荐

