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

如何使用Eloquent按有效价格对产品价格表进行升序排序?

解决方案:按有效价格对产品价格表升序排序

没问题,我会一步步给你讲清楚每个部分的作用,毕竟刚学SQL的时候确实容易对条件判断和排序懵圈😉

先直接给你能用的完整SQL代码,之后再拆解每一部分:

SELECT 
    product_id,
    seller_id,
    original_price,
    sale_price,
    sale_start_date,
    sale_end_date,
    -- 核心:计算每个产品的有效价格
    CASE
        WHEN sale_price != 0 AND CURRENT_DATE BETWEEN sale_start_date AND sale_end_date THEN sale_price
        ELSE original_price
    END AS effective_price
FROM 
    -- 这里替换成你的实际表名,比如你的表叫product_price_table就改这里
    product_prices
ORDER BY 
    effective_price ASC;

一步步拆解解释:

1. 用CASE语句计算有效价格

这是整个需求的核心,CASE就像SQL里的「if-else」判断逻辑,帮我们根据规则选择价格:

  • 第一个判断条件:sale_price != 0 AND CURRENT_DATE BETWEEN sale_start_date AND sale_end_date
    • sale_price != 0:确保促销价格不是0(符合你说的「sale_price不为0」的要求)
    • CURRENT_DATE BETWEEN sale_start_date AND sale_end_date:检查当前日期是否在促销周期内,BETWEEN是包含首尾日期的(比如促销期是5.1到5.30,5.1和5.30当天也算有效)
  • 当两个条件都满足时,我们取sale_price作为有效价格;否则(不管是促销价为0、还是不在促销期),都取original_price
  • 最后用AS effective_price给计算出来的价格起一个别名,方便后面排序和查看

2. 选择要显示的字段

SELECT后面列出的是你要从表中获取的内容:我把你提到的所有原始字段都列出来了,再加上我们计算的effective_price,这样你能直观看到每个产品的原始数据和对应的有效价格

3. 指定数据源

FROM product_prices这里要替换成你实际的表名,比如你的表叫product_price_list,就改成FROM product_price_list

4. 按有效价格升序排序

ORDER BY effective_price ASC就是让结果按照我们计算出来的有效价格从小到大排列,ASC表示升序(如果要降序可以改成DESC)


几个需要注意的小细节:

  • 关于当前日期函数:CURRENT_DATE是大多数主流数据库(MySQL、PostgreSQL、SQLite等)通用的获取当前日期的函数,但如果你用的是Oracle,需要换成SYSDATE;如果是SQL Server,可以用GETDATE()或者CURRENT_TIMESTAMP(后者带时间,不过BETWEEN比较日期时会自动忽略时间部分)
  • 如果有些产品的sale_start_date或sale_end_date是NULL(比如没有设置促销期),那么CURRENT_DATE BETWEEN ...会返回「不满足」,自动用原价,这符合逻辑
  • 如果你不想显示effective_price这个字段,只想用它排序,也可以把CASE语句直接写在ORDER BY里,比如:
    SELECT 
        product_id,
        seller_id,
        original_price,
        sale_price,
        sale_start_date,
        sale_end_date
    FROM 
        product_prices
    ORDER BY 
        CASE
            WHEN sale_price != 0 AND CURRENT_DATE BETWEEN sale_start_date AND sale_end_date THEN sale_price
            ELSE original_price
        END ASC;
    
    这样结果里就不会显示有效价格,但依然按它排序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:07:41