Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当使用会话变量时,如何在存储过程中运行此查询_Mysql_Sql_Stored Procedures - Fatal编程技术网

Mysql 当使用会话变量时,如何在存储过程中运行此查询

Mysql 当使用会话变量时,如何在存储过程中运行此查询,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我发现这个查询是正确的 如您所见,它使用@myvar和@rownum作为会话变量选择IF(@myvar=readdate,@rownum:=@rownum+1,@rownum:=0) 问题是,无法在存储过程内部运行此过程,因为@myvar:=0语法未知,我必须在选择运行时内部引用/设置 您将如何重写上述查询以在存储过程中使用 要测试的样本数据和查询可在 要测试的第二组数据在此使用 SET @myvar := 0; 要在SP内指定值,请执行以下操作: DELIMITER $$ CREATE P

我发现这个查询是正确的

如您所见,它使用
@myvar
@rownum
作为会话变量
选择IF(@myvar=readdate,@rownum:=@rownum+1,@rownum:=0)

问题是,无法在存储过程内部运行此过程,因为
@myvar:=0
语法未知,我必须在选择运行时内部引用/设置

您将如何重写上述查询以在存储过程中使用

要测试的样本数据和查询可在
要测试的第二组数据在此使用

SET @myvar := 0;
要在SP内指定值,请执行以下操作:

DELIMITER $$

CREATE PROCEDURE prc_median()
BEGIN
SET @myvar:=0;
SET @rownum:=0;
SELECT result.readdate,
       AVG(total_gallons) AS total_gallons
FROM   (SELECT middle_rows.readdate,
               numerated_rows.rownum,
               numerated_rows.total_gallons
        FROM   (SELECT IF(@myvar = readdate, @rownum := @rownum + 1, @rownum := 0) AS rownum,
                       @myvar := readdate                                          AS readdate_alias,
                       total_gallons
                FROM   _temp_total_gallons
                ORDER  BY readdate,
                          total_gallons) numerated_rows,
               (SELECT readdate,
                       COUNT(*) / 2 median
                FROM   _temp_total_gallons
                GROUP  BY readdate) middle_rows
        WHERE  numerated_rows.rownum BETWEEN ( middle_rows.median - IF(median = ROUND(median), 1, 0) - 0.5 ) AND ( middle_rows.median - IF(median = ROUND(median), 0, 0.5) )
               AND numerated_rows.readdate_alias = middle_rows.readdate) result
GROUP  BY readdate;
END;
$$
使用

要在SP内指定值,请执行以下操作:

DELIMITER $$

CREATE PROCEDURE prc_median()
BEGIN
SET @myvar:=0;
SET @rownum:=0;
SELECT result.readdate,
       AVG(total_gallons) AS total_gallons
FROM   (SELECT middle_rows.readdate,
               numerated_rows.rownum,
               numerated_rows.total_gallons
        FROM   (SELECT IF(@myvar = readdate, @rownum := @rownum + 1, @rownum := 0) AS rownum,
                       @myvar := readdate                                          AS readdate_alias,
                       total_gallons
                FROM   _temp_total_gallons
                ORDER  BY readdate,
                          total_gallons) numerated_rows,
               (SELECT readdate,
                       COUNT(*) / 2 median
                FROM   _temp_total_gallons
                GROUP  BY readdate) middle_rows
        WHERE  numerated_rows.rownum BETWEEN ( middle_rows.median - IF(median = ROUND(median), 1, 0) - 0.5 ) AND ( middle_rows.median - IF(median = ROUND(median), 0, 0.5) )
               AND numerated_rows.readdate_alias = middle_rows.readdate) result
GROUP  BY readdate;
END;
$$

我已经尝试过了,当从SP运行此查询(不正确)和手动执行(正确)时,结果不一样。它遗漏了一些行,可能是因为在选择变量中,变量在SP中没有以相同的方式更新。我已经在更新的问题中包含了示例数据导出和查询。@奔腾10:两者都为我返回相同的值:
'2009-04-21',10890.000000'2009-08-25',26300.000000'2009-10-20',3300.000000'2009-10-22',5036.500000'2009-12-01',7837.000000
2009-04-14和2009-04-15为何缺失?我会马上用正确的数据和错误的结果更新要点。@Pentium10:我不知道。正如我所说,两者返回的结果都是一样的。我已经尝试过了,当这个查询从SP运行时(不正确),当我手动执行时(正确),结果不一样。它遗漏了一些行,可能是因为在选择变量中,变量在SP中没有以相同的方式更新。我已经在更新的问题中包含了示例数据导出和查询。@奔腾10:两者都为我返回相同的值:
'2009-04-21',10890.000000'2009-08-25',26300.000000'2009-10-20',3300.000000'2009-10-22',5036.500000'2009-12-01',7837.000000
2009-04-14和2009-04-15为何缺失?我会马上用正确的数据和错误的结果更新要点。@Pentium10:我不知道。正如我所说,两者都返回相同的值。它们被称为会话变量。它们被称为会话变量。