SET @v100 :=(select count(*) from train_stations); select * from train_stations limit (select @v100)-1,1;
错误:错误代码:1064。您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行的“@ v100,1”附近使用正确的语法
这个没有用户变量的查询也没有工作
select * from train_stations limit (select count() from train_stations)-1,1;
错误代码:1064。您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以便在'(选择计数()from train_stations)附近使用正确的语法)-1,1'在第1行
答案 0 :(得分:1)
您无法在LIMIT
中使用用户定义的变量。相反,您可以使用PREPARE STATEMENT
。下面的例子
PREPARE STMT FROM
" SELECT * FROM tab LIMIT ?,1 ";
select @START := count(*) from tab;
set @START := @START - 1;
select @START;
EXECUTE STMT USING @START;
DEALLOCATE PREPARE STMT;
这里的演示小提琴http://sqlfiddle.com/#!8/ae474/11
修改强>
基本上,您正在尝试获取表格中的最后一条记录,您可以使用ORDER BY
子句轻松完成该记录,例如
select * from train_stations order by some_id desc limit 1
答案 1 :(得分:0)
为什么不在表中放置id列或时间戳列?在MySQL中没有诸如行的“自然顺序”这样的东西,你试图依赖它。
然后所有的魔法都会崩溃到
select * from train_stations order by id desc limit 1;
或
select * from train_stations order by insert_tmstmp desc limit 1;
编辑:你的方法的一个大问题是MySQL必须遍历train_stations的每一行只是为了抛弃它们而只保留最后一行。最好只告诉MySQL你想要直接输入这一行。