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

MySQL带ORDER BY的子查询不生效问题求助

问题原因与修正方案

问题根源

你的子查询没有关联外部查询的parent_id,它是从整个t2表中筛选出全局优先级最高的单一行ID,而不是针对每个parent_id(即每个t1中的产品)单独筛选对应的最高优先级行。

举个例子:单独运行子查询会得到id=103(对应parent_id=2的ordered状态、最大version_2的行),但关联t1.id=1时,t2中不存在parent_id=1且id=103的行,所以产品A的payment字段会为空,完全不符合预期。

修正后的SQL写法

可以用窗口函数ROW_NUMBER(),按parent_id分组,再按照你的筛选逻辑排序,取每组的第一行:

SELECT t1.id, t1.Product, t2.payment
FROM t1
LEFT JOIN (
    SELECT 
        parent_id, payment,
        ROW_NUMBER() OVER (
            PARTITION BY parent_id 
            ORDER BY 
                FIELD(status, 'ordered', 'changed', 'paid'),
                version_2 DESC,
                version_1 DESC
        ) AS rn
    FROM t2
) t2 ON t1.id = t2.parent_id AND t2.rn = 1;

逻辑说明

  • PARTITION BY parent_id:按产品分组,确保每个产品单独计算优先级
  • ORDER BY子句严格遵循你的筛选规则:先按status优先级排序,再取最大version_2,最后取最大version_1
  • rn=1:取每个分组中优先级最高的那一行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:32:47