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

如何在子查询中引用父查询的id_product字段?

解决子查询无法访问父表字段的问题

问题原因

你遇到的是SQL子查询的作用域限制问题:多层嵌套的子查询中,最内层查询无法直接引用最外层父查询的字段,只能访问直接外层查询的变量,因此sh.id = p.id_product会失效。

解决方案

以下两种方法可实现对每个id_product执行子查询的需求:

方法1:使用LATERAL JOIN(适用于MySQL 8.0+、PostgreSQL等支持的数据库)

这种方式允许内层查询直接引用外层表字段,每个id_product会独立执行一次内层查询:

SELECT 
    p.id_product,     
    COALESCE(SUM(sub.total_quantity), 0) AS AVG30
FROM
    ps1769_product p
LEFT JOIN LATERAL (
    SELECT SUM(cp.quantity) AS total_quantity
    FROM ps1769_xcustom_stock_history sh
    LEFT JOIN ps1769_cart_product cp 
        ON cp.id_product = sh.id AND DATE(cp.date_add) = sh.date
    WHERE sh.id = p.id_product
      AND sh.date <= '2023-10-10'
      AND sh.quantity > 0
    GROUP BY sh.date
    ORDER BY sh.date DESC
    LIMIT 30
) AS sub ON TRUE
GROUP BY p.id_product;

方法2:窗口函数筛选前30条记录(兼容更多数据库版本)

先通过窗口函数给每个id的日期按倒序排名,筛选出最近30天,再关联计算总和:

SELECT 
    p.id_product,
    COALESCE(SUM(cp_sum.total_quantity), 0) AS AVG30
FROM ps1769_product p
LEFT JOIN (
    SELECT 
        sh.id,
        sh.date,
        SUM(cp.quantity) AS total_quantity
    FROM ps1769_xcustom_stock_history sh
    LEFT JOIN ps1769_cart_product cp 
        ON cp.id_product = sh.id AND DATE(cp.date_add) = sh.date
    WHERE sh.date <= '2023-10-10'
      AND sh.quantity > 0
    GROUP BY sh.id, sh.date
) AS cp_sum ON cp_sum.id = p.id_product
INNER JOIN (
    SELECT id, date
    FROM (
        SELECT 
            id,
            date,
            ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS rn
        FROM ps1769_xcustom_stock_history
        WHERE date <= '2023-10-10'
          AND quantity > 0
    ) AS ranked
    WHERE rn <= 30
) AS top30_dates ON top30_dates.id = cp_sum.id AND top30_dates.date = cp_sum.date
GROUP BY p.id_product;

内容的提问来源于stack exchange,提问作者Daniel Krzyżanowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:48:40