【问题标题】:Mysql procedure increment variableMysql过程增量变量
【发布时间】:2013-12-03 14:16:09
【问题描述】:

我正在尝试使用存储的时间来获取表中用户的排名。

RAW SQL 查询工作正常,但我无法使其作为过程工作。

SET @rownum := 0;
SELECT rank, user_id, best_time
FROM (
  SELECT @rownum := @rownum +1 AS rank,id, best_time, user_id
  FROM user_round WHERE round_id=1 ORDER BY best_time ASC
) AS result WHERE user_id = 1 

我的尝试:

BEGIN
 DECLARE variable INT DEFAULT 0;
 SELECT rank,best_time, user_id
 FROM (
  SELECT SET variable=variable+1 AS rank, best_time, user_id
  FROM database.user_round WHERE round_id=1 ORDER BY best_time ASC
 ) AS result WHERE user_id = 1;
END

【问题讨论】:

  • 尝试从SELECT SET variable=variable+1中删除SET
  • 如果我删除设置我可以保存程序但排名始终为 0

标签: mysql procedure


【解决方案1】:

您需要继续使用9.4. User-Defined Variables,而不是13.6.4.1. Local Variable DECLARE Syntax

BEGIN
    -- DECLARE variable INT DEFAULT 0;
    SELECT rank, best_time, user_id
    FROM (
        -- SELECT SET variable = variable + 1 AS rank, best_time, user_id
        SELECT @variable := @variable + 1 AS rank, best_time, user_id
        FROM database.user_round, (SELECT @variable := 0) init
        WHERE round_id = 1
        ORDER BY best_time ASC
    ) AS result
    WHERE user_id = 1;
END

【讨论】:

  • 在这种情况下,您可能需要注意这一点:The difference between a procedure variable and a session variable is that procedure variable is reinitialized to NULL each time the procedure is called, while the session variable is not 如在:stackoverflow.com/a/1010042 中提到的那样:
  • @AzizShaikh:没错,所以它在每次执行存储过程时都会初始化变量@variable。见(SELECT @variable := 0) init
  • 我们为什么要坚持使用用户变量,因为如果从两个或更多线程同时调用存储过程,它们会导致查询失败?
猜你喜欢
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多