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
相关产品推荐
相关产品推荐

