Mysql 无法在存储过程中使用偏移量和限制
目前我正在使用Mysql 无法在存储过程中使用偏移量和限制,mysql,Mysql,目前我正在使用offset和limit从表中检索有限的数据,但是当我将数据库从development移动到托管服务器时,查询时会显示语法错误,如果我删除offset和limit语法,它会工作得很好。对这个问题有什么想法或解决办法吗 SELECT e.A, e.B, e.C, e.D, e.E, e.F, e.G FROM T1 e where e.A = 1 order by e.B desc
offset
和limit
从表中检索有限的数据,但是当我将数据库从development
移动到托管服务器
时,查询时会显示语法错误,如果我删除offset
和limit
语法,它会工作得很好。对这个问题有什么想法或解决办法吗
SELECT
e.A,
e.B,
e.C,
e.D,
e.E,
e.F,
e.G
FROM
T1 e
where e.A = 1
order by e.B desc
limit in_count
offset in_offset;
根据mysql官方网站: 为了与PostgreSQL兼容,MySQL支持限制行数 偏移语法 我认为您的语法是正确的,问题可能在于
LIMIT/OFFSET
子句中使用的过程变量,或者数据库引擎对它的解释方式可能有一个旧的不兼容版本,无法解释OFFSET
作为替代解决方法,尝试在LIMIT子句中使用,
逗号分隔符来指定偏移量,这可能会解决问题
SELECT
e.A,
e.B,
e.C,
e.D,
e.E,
e.F,
e.G
FROM
T1 e
where e.A = 1
order by e.B desc
limit in_offset,in_count;
您的问题很可能是由于主机提供商使用的MySQL服务器版本比您在测试中使用的版本旧
您描述的问题是MySQL中已修复的错误:
该补丁于2010年第三季度发布,版本为5.5.6。
如果您的主机提供商有5.5.6之前版本的MySQL,这就解释了您的困难所在。发布
STATUS
命令MySQL,让它告诉您它的版本以及其他内容。您不能像这样填写在\u count
和在\u offset
中。(同样,不能传入表名或其他一些构造。)
相反,使用CONCAT
构建一个字符串,其中包含SELECT
,并填充in\u count
,等等。然后准备
,执行
和解除分配
(不要使用USING
尝试在_count
中填写;它将因同样的原因失败。因此使用CONCAT
)
参考:
例如:
SET @s = concat('SELECT * FROM ', uview, ' ORDER BY ', uindex, ' LIMIT ', offset, ',2000' );
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
(问题在于存储过程内部的替换。)Mysql过程可以应用直接SQL查询,而不需要准备语句。在这里,您可以传递任何形式的变量,只要这些变量被正确初始化,就可以进行替换。您可以将其称为解决方法,但实际上并不是主要问题@RickJames