error 1235是mysql 5.7及更早版本的语法限制,不支持in/any/all/some子句中直接使用带limit的子查询;绕过方法包括加派生表别名、改用join或php层拼接id列表。

phpEnv 自带的 MySQL 版本(通常是 5.7.x 或更早)默认不支持 IN 子句里直接嵌套带 LIMIT 的子查询,报错 ERROR 1235 (42000) 是必然结果,不是配置问题,也不是权限问题,是语法限制本身。
为什么 phpEnv 下的 MySQL 会触发 ERROR 1235
phpEnv 多数封装的是 MySQL 5.7.22 及之前版本,而该限制直到 MySQL 8.0.20 才被部分放宽(仅对 IN + 派生表形式的 LIMIT 有优化,ALL/ANY/SOME 仍受限)。你写的类似这样的语句:
SELECT * FROM user WHERE id IN (SELECT user_id FROM order GROUP BY user_id ORDER BY COUNT(*) DESC LIMIT 5)
就会立刻触发错误。核心原因是 MySQL 解析器在 5.7 中拒绝把 LIMIT 和集合操作符(IN、ANY 等)放在同一级子查询中。
绕过 1235 错误的三种实操写法
不用升级 phpEnv 或换环境,直接改 SQL 结构即可。注意:以下所有方案都要求子查询只返回单列(如 user_id),否则会额外触发 ERROR 1241(Operand should contain 1 column(s))。
- 加一层派生表(最常用):
SELECT * FROM user WHERE id IN (SELECT user_id FROM (SELECT user_id FROM order GROUP BY user_id ORDER BY COUNT(*) DESC LIMIT 5) AS tmp)
- 用
INNER JOIN替代(性能通常更好,尤其数据量大时):SELECT u.* FROM user u INNER JOIN (SELECT user_id FROM order GROUP BY user_id ORDER BY COUNT(*) DESC LIMIT 5) AS tmp ON u.id = tmp.user_id
- 先查出 ID 列表,在 PHP 层拼成静态值(适合 ID 数量少、变化不频繁):
$ids = $pdo->query("SELECT user_id FROM order GROUP BY user_id ORDER BY COUNT(*) DESC LIMIT 5")->fetchAll(PDO::FETCH_COLUMN);<br>if ($ids) {<br> $placeholders = str_repeat('?,', count($ids) - 1) . '?';<br> $stmt = $pdo->prepare("SELECT * FROM user WHERE id IN ($placeholders)");<br> $stmt->execute($ids);<br>}
哪些写法看似合理但实际仍报 1235
这些结构在 phpEnv 的 MySQL 5.7 下依然非法,别试:
-
WHERE id = ANY (SELECT id FROM t LIMIT 10)——ANY同样受限制 -
WHERE id IN (SELECT id FROM t ORDER BY created_at DESC LIMIT 10)—— 缺少外层包装,直接报错 -
UPDATE t1 SET status=1 WHERE id IN (SELECT id FROM t2 LIMIT 1)—— UPDATE 场景下该限制同样生效,且还会叠加ERROR 1093(不能更新自己 SELECT 的表)
真正容易被忽略的是:这个限制不仅存在于 IN,还蔓延到 ALL、ANY、SOME 所有集合比较操作;而且只要子查询里出现 LIMIT,不管有没有 ORDER BY,都会触发。包一层派生表是最小侵入式解法,但要注意别漏掉 AS alias —— MySQL 5.7 要求派生表必须有别名。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











