将值传递给嵌套子查询

Tam*_*Tam 6 mysql subquery

我有以下查询(为简洁起见已删除),其目的是创建w8用于对结果进行排序的值:

SELECT elements.id, [ ... ],
(SELECT 
    COALESCE(craft_w8_a.weight, 0) + COALESCE(SUM(craft_w8_b.weight), 0) 
    FROM `craft_w8` `craft_w8_a`
    LEFT JOIN `craft_w8` `craft_w8_b` 
        ON craft_w8_b.elementId
        IN ( SELECT targetId FROM `craft_relations`
                WHERE fieldId IN (15, 16)
                  AND sourceId = elements.id)
    WHERE craft_w8_a.elementId = elements.id
) as w8
FROM `craft_elements` `elements`
[ ... ]
GROUP BY `elements`.`id`
ORDER BY `w8` DESC, `name` ASC LIMIT 100
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是第二个嵌套子查询(左连接中的那个)无法elements.id从初始选择中找到该列。

从我发现在 SQL 中搜索只传递一级深度的值,我一直无法找到合适的解决方法。

是否可以强制 SQL 传递比一级更深的值?或者有没有办法修改查询以不使用另一个子查询,但仍然得到相同的结果?

对不起,如果我做任何愚蠢的事情或遗漏了任何明显的东西,SQL 不是我的强项!

And*_*y M 6

据我所知,此限制特别适用于 MySQL 中的 SQL。我知道的所有其他 SQL 产品都没有它。

通常似乎没有解决此问题的方法:您不能强制在 MySQL 中比一个级别更深地识别列引用。但是,在您的特定情况下有一个简单的解决方法:elements.id将最里面的查询替换为craft_w8_a.elementId

SELECT elements.id, [ ... ],
(SELECT 
    COALESCE(craft_w8_a.weight, 0) + COALESCE(SUM(craft_w8_b.weight), 0) 
    FROM `craft_w8` `craft_w8_a`
    LEFT JOIN `craft_w8` `craft_w8_b` 
        ON craft_w8_b.elementId
        IN ( SELECT targetId FROM `craft_relations`
                WHERE fieldId IN (15, 16)
                  AND sourceId = craft_w8_a.elementId)
    WHERE craft_w8_a.elementId = elements.id
) as w8
FROM `craft_elements` `elements`
[ ... ]
GROUP BY `elements`.`id`
ORDER BY `w8` DESC, `name` ASC LIMIT 100
Run Code Online (Sandbox Code Playgroud)

这是一个等效的替代品,因为craft_w8_a.elementId将传递给 IN 子查询的任何内容都将根据传递elements.id值的查询中的过滤器进行匹配。