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

MySQL查询:获取最新更新状态为NEW的listings数据

获取最新更新状态为指定值的Listings数据

针对你的需求,我整理了两种实用的SQL查询方案,都能轻松满足“获取关联最新更新状态为NEW(且支持未来扩展更多状态)的listings数据”的要求:

方案一:使用窗口函数(推荐,可读性高)

窗口函数是处理这类分组取最新记录场景的绝佳选择,逻辑清晰且易于维护:

SELECT l.*
FROM listings l
JOIN (
    SELECT 
        lu.listing_id,  -- 假设listing_updates通过这个字段关联listings的id
        lu.status,
        -- 按listing分组,每个分组内按更新id降序排序,最新的记录行号为1
        ROW_NUMBER() OVER (PARTITION BY lu.listing_id ORDER BY lu.id DESC) AS rn
    FROM listing_updates lu
) latest_updates ON l.id = latest_updates.listing_id
WHERE latest_updates.rn = 1  -- 只保留每个listing的最新更新
  AND latest_updates.status IN ('NEW');  -- 扩展时直接添加状态值,比如('NEW', 'APPROVED')

关键优势:

  • 扩展性拉满:未来需要新增支持的status值,只需要在IN子句的括号里添加即可,完全不需要改动查询的核心逻辑
  • 逻辑清晰:通过ROW_NUMBER()明确标记出每个listing的最新更新记录,读代码就能立刻理解意图
  • 兼容性好:支持绝大多数现代数据库(PostgreSQL、MySQL 8.0+、SQL Server、Oracle等)

方案二:使用分组子查询(兼容性更广)

如果你的数据库版本较低不支持窗口函数,可以用这种分组取最大id的方式实现:

SELECT l.*
FROM listings l
-- 关联到最新的更新记录
JOIN listing_updates lu 
    ON l.id = lu.listing_id
-- 先获取每个listing对应的最大更新id(即最新更新)
JOIN (
    SELECT listing_id, MAX(id) AS latest_update_id
    FROM listing_updates
    GROUP BY listing_id
) latest_ids 
    ON lu.id = latest_ids.latest_update_id
WHERE lu.status IN ('NEW');  -- 同样支持直接扩展状态值

关键说明:

  • 这种方法通过先分组获取每个listing的最新更新id,再关联回原表筛选状态,逻辑同样可靠
  • 适合不支持窗口函数的老版本数据库,比如MySQL 5.x系列

不管选择哪种方案,核心都是先锁定每个listing的最新更新记录,再筛选状态,并且通过IN子句保证了未来添加新status值的扩展性——只要把新状态加入括号里就行,非常灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:41:49