You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 ;

代码说明

  1. WHERE子句过滤卧室数:在分组前直接筛选对应卧室数的房源,比HAVING分组后过滤更高效。
  2. 按房源ID分组:确保每个分组对应单个房源,精准计算该房源的最低挂牌价MIN(l.price)。
  3. 排序逻辑:先按最低价格升序排序,第一条即为价格最低的房源;若存在价格相同的房源,按房源ID降序取第一个。
  4. LIMIT 1:直接获取排序后的第一条结果,得到目标房源ID。

内容的提问来源于stack exchange,提问作者Peter Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:15:58