MySQL存储过程报错:无法将id字段SELECT INTO到@testId变量
问题排查与解决
咱们先拆解一下你这条SQL语句里的几个关键问题,这些都是导致执行报错的核心原因:
1. SELECT INTO 语法错误
你的语句里连续写了两次INTO:SELECT id INTO @testId, (...) AS dist INTO @distance,这完全不符合MySQL的语法规范。MySQL的SELECT INTO要求所有要赋值的变量都放在同一个INTO子句中,列的顺序要和变量顺序严格对应。
2. GROUP BY 逻辑误用
你把筛选条件route_ID = @routeID AND (type = 'PICK' OR type = 'CAMPUS')写在了GROUP BY里,这会让MySQL把这个条件的布尔结果(0或1)当作分组依据,而不是筛选出符合条件的行。筛选行应该用WHERE子句,GROUP BY是用来对数据进行分组聚合的,这里你要找的是符合条件且距离最近的单个记录,根本不需要分组操作,直接去掉GROUP BY就好。
修正后的完整SQL语句
SELECT id, (3959 * ACOS ( COS ( RADIANS(deviceLat) ) * COS( RADIANS(`latitude`) ) * COS( RADIANS(`longitude`) - RADIANS(deviceLong) ) + SIN ( RADIANS(deviceLat) ) * SIN( RADIANS(`latitude`) ) )) AS dist INTO @testId, @distance FROM route_waypoints WHERE route_ID = @routeID AND (type = 'PICK' OR type = 'CAMPUS') HAVING dist < 250 ORDER BY dist ASC LIMIT 1;
额外说明
- 因为
dist是计算生成的列,不能用WHERE过滤,所以用HAVING是正确的; - 如果这条语句在存储过程中执行,要确保
deviceLat、deviceLong、@routeID这些变量已经被正确赋值,否则也会导致查询无结果或报错; - 如果担心没有符合条件的记录时抛出"no data found"错误,可以在存储过程中加上
DECLARE CONTINUE HANDLER FOR NOT FOUND来捕获这个情况,避免存储过程中断。
内容的提问来源于stack exchange,提问作者Dipika
相关产品推荐
相关产品推荐

