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

如何修改关联查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:40:24