MySQL嵌套子查询WHERE子句报Unknown column未知列错误问题
错误原因
你遇到的1054未知列报错是MySQL版本差异导致的语法兼容性问题:
MySQL 5.7及更早版本的关联子查询仅支持引用上一层父查询的表字段,你的原SQL中e_mills.m_id属于最外层主查询的字段,而引用它的WHERE条件被包裹在了两层子查询内部(内层查询外面还有一层做LIMIT的派生表),低版本MySQL无法穿透两层子查询识别外层字段,因此抛出未知列错误。
环境差异说明
本地可以正常运行、其他环境运行失败的原因和你验证的结果一致:MySQL 8.0对关联子查询的解析逻辑做了优化,支持跨多层引用外层表字段,所以你的原语句可以在8.0版本正常执行,而运行失败的环境使用的是5.7及更早的MySQL版本。
修复方案
如果无法升级失败环境的MySQL版本,可以使用兼容低版本的写法实现相同逻辑,参考SQL如下:
SET sql_mode = ''; SELECT e_mills.m_id, e_mills.mill_name, e_cities.city_name, e_sugardata.mill_closing_stock, GROUP_CONCAT(CASE WHEN s.sort <= 4 THEN s.mill_closing_stock END SEPARATOR ', ') AS stock_chart FROM e_mills INNER JOIN e_cities ON e_mills.city_id = e_cities.city_id INNER JOIN e_sugardata ON e_sugardata.m_id = e_mills.m_id LEFT JOIN ( SELECT m_id, mill_closing_stock, @sort := IF(@curr_mid = m_id, @sort + 1, 1) AS sort, @curr_mid := m_id FROM `e_sugardata` CROSS JOIN (SELECT @sort := 0, @curr_mid := 0) AS init_var ORDER BY m_id, date_added DESC ) AS s ON s.m_id = e_mills.m_id GROUP BY e_mills.m_id, e_mills.mill_name, e_cities.city_name, e_sugardata.mill_closing_stock ORDER BY e_mills.province_id
上述写法通过变量给每个m_id对应的记录按date_added倒序排序打标,不需要嵌套两层子查询,兼容所有MySQL 5.x及以上版本。
内容的提问来源于stack exchange,提问作者Azeem Haider
相关产品推荐
相关产品推荐

