LEFT JOIN关联子查询触发1054未知列out.id错误的解决方法求助
报错原因
你遇到的1054错误是因为SQL执行逻辑中,LEFT JOIN后的子查询(派生表)默认是独立解析的,无法直接访问外层查询的out表字段,因此在子查询内部引用out.id会被判定为未知列。
解决方案
方案1:将过滤条件移至JOIN的ON子句(兼容所有MySQL版本,推荐)
不需要在子查询内部引用外层表字段,把匹配逻辑放到关联条件中即可,全程无需用到变量:
SELECT `out`.`id`, `c`.`coupon_code`, `c`.`outlet_id` FROM `outlet` `out` LEFT JOIN ( SELECT `coupon_code`,`outlet_id` FROM `coupon` ) `c` ON FIND_IN_SET(`out`.`id`,'1,2,3') AND `c`.`outlet_id` IS NOT NULL WHERE `out`.`id` = 1;
如果你的子查询还有其他独立的过滤规则,直接在子查询内部编写即可,不影响外层字段的匹配逻辑。
方案2:使用LATERAL派生表(仅支持MySQL 8.0+)
如果你的业务逻辑必须要在子查询内部引用外层表的字段,可以用MySQL 8.0新增的LATERAL关键字,允许派生表引用外层查询的字段:
SELECT `out`.`id`, `c`.`coupon_code`, `c`.`outlet_id` FROM `outlet` `out` LEFT JOIN LATERAL ( SELECT `coupon_code`,`outlet_id` FROM `coupon` WHERE FIND_IN_SET(`out`.`id`,'1,2,3') ) `c` ON `c`.`outlet_id` IS NOT NULL WHERE `out`.`id` = 1;
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

