如何修改关联查询SQL,过滤Shoe表size与model_id重复的行?
解决方法
针对你的需求,核心是先筛选出每个size + model_id组合下created_at最新的记录,再关联Model表并排序取数,下面提供两种通用的实现方式:
方法一:使用窗口函数(推荐,支持MySQL 8+、PostgreSQL、SQL Server等现代数据库)
利用ROW_NUMBER()窗口函数,按size和model_id分组,给每组内的记录按created_at倒序编号,只保留编号为1的(即每组最新的记录),最后再排序取前10:
SELECT s.*, m.name FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY size, model_id ORDER BY created_at DESC) AS rn FROM Shoe ) s JOIN Model m ON s.model_id = m.id WHERE s.rn = 1 ORDER BY s.created_at DESC LIMIT 10;
逻辑说明:
- 子查询里的
PARTITION BY size, model_id会把数据按size和model_id的唯一组合分组 ORDER BY created_at DESC让每组内最新的记录排在最前面,ROW_NUMBER()给它标记为1- 外层筛选
rn=1就得到了每个组合的最新记录,再关联Model表获取名称,最后按创建时间倒序取10条
方法二:子查询筛选最大创建时间(兼容旧版MySQL)
如果你的数据库不支持窗口函数,可以通过子查询先找出每个size + model_id对应的最大created_at,再关联原表和Model表:
SELECT s.*, m.name FROM Shoe s JOIN Model m ON s.model_id = m.id JOIN ( SELECT size, model_id, MAX(created_at) AS latest_created FROM Shoe GROUP BY size, model_id ) t ON s.size = t.size AND s.model_id = t.model_id AND s.created_at = t.latest_created ORDER BY s.created_at DESC LIMIT 10;
逻辑说明:
- 子查询
t通过GROUP BY size, model_id计算出每个组合的最新创建时间 - 外层将Shoe表与
t关联,筛选出每个组合中创建时间等于最新时间的记录,再关联Model表获取名称,最后排序取数
注意点:
如果同一个size + model_id组合下有多条记录的created_at完全相同,方法二会返回所有这些记录,而方法一只会返回其中一条(取决于数据库的排序规则)。如果需要处理这种情况,可以根据实际需求调整窗口函数的排序字段(比如加上id DESC)。
内容的提问来源于stack exchange,提问作者Rookie_Mistake
相关产品推荐
相关产品推荐

