【问题标题】:MySQL limit with variableMySQL 限制变量
【发布时间】:2014-09-25 08:09:56
【问题描述】:

我的语法有错误:

SET @start := 0;
SELECT (ROUND((count(item))/2)) FROM car INTO @until; 

SELECT * FROM car
LIMIT @until OFFSET @start;

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“@until OFFSET @start”附近使用正确的语法

谁能帮帮我?
谢谢

【问题讨论】:

    标签: mysql variables limit


    【解决方案1】:

    你可以试试这样的:

    DELIMITER //
    CREATE PROCEDURE pagination(
        INT pageno INT
    )
    BEGIN
        DECLARE pages INT;
        DECLARE pagefrom INT;
    
        SET pages = 1000; -- get this many records at a time
        SET pagefrom = pageno * pages; -- 2 * 1000 = 2000
    
        SELECT *
        FROM car
        LIMIT pagefrom, pages;
    END //
    DELIMITER ;
    
    CALL pagination(2);
    

    这个例子将获取从 2000 到 3000 的记录

    【讨论】:

    • 对于那些没有立即明白这一点的人:您可以使用DECLARE 语法来定义local variables,而不是使用user-defined 变量。以这种方式声明的局部变量可以与LIMIT 一起使用。请记住,DECLARE 语句必须首先写入准备好的语句的主体内。
    【解决方案2】:

    您不能在 LIMIT 子句中使用 user-defined 变量 (@until)。

    一种可能的解决方案(this 的变体):

    SELECT (ROUND((count(item))/2)) FROM car INTO @until;
    SELECT * FROM (
      SELECT *, 
             @rownum := @rownum + 1 AS rank
        FROM car, 
             (SELECT @rownum := 0) r
    ) d WHERE rank < @until;
    

    唯一的缺点是您会丢失偏移量,但您可以通过调整 WHERE 子句来适应它。否则,您可以使用存储过程。

    【讨论】:

    • [Err] 1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ':= @until' 附近使用正确的语法
    • 废话,问题在于您使用LIMIT 的变量。看来你不能在那里使用它:stackoverflow.com/questions/245180/…。我会用可能的解决方案更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多