PDOException SQLSTATE[42000]语法错误求助:MySQL 1064错误排查
解决你的MySQL语法错误问题
这是个典型的SQL语法结构错误,我帮你拆解下问题所在,再给出修正方案:
错误核心原因
你把过滤条件AND Sold = 0直接放在了FROM子句的子查询闭合括号后面,这不符合MySQL的语法规则——在表连接/子查询之后,过滤条件必须通过WHERE关键字声明,而且你还漏给FROM里的子查询加别名(MySQL要求子查询必须有别名才能被引用)。
修正后的完整SQL
select * from ( numbers t inner join ( select distinct n.Number from ( select 1 start union all select 2 union all select 3 union all select 4 union all select 5 ) s cross join numbers n where left(substring(n.Number, s.start, 2), 1) <> right(substring(n.Number, s.start, 2), 1) and n.Number like concat( '%', substring(n.Number, s.start, 2), substring(n.Number, s.start, 2), substring(n.Number, s.start, 2), substring(n.Number, s.start, 2), '%' ) ) n on n.Number = t.Number ) AS temp_table -- 给子查询添加别名,MySQL强制要求 WHERE temp_table.Sold = 0 -- 用WHERE关键字声明过滤条件,明确字段所属的子查询 ORDER BY Date DESC, Count DESC, Price ASC;
额外实用建议
- 写复杂嵌套SQL时,一定要分层格式化,能快速发现括号不匹配、语法错位的问题;
- 所有字段尽量加上表/别名前缀,避免字段歧义(比如
temp_table.Sold比直接写Sold更清晰); - 遇到语法错误时,可以先把嵌套的子查询单独拿出来执行,逐步排查问题点,比直接看整段SQL高效得多。
内容的提问来源于stack exchange,提问作者Not Sure




