【问题标题】:Processing intermediate results in MySQL stored procedure在 MySQL 存储过程中处理中间结果
【发布时间】:2010-06-19 18:06:48
【问题描述】:

我尝试使用存储过程对我的数据进行一些加权。基本上这意味着将某些列与它们各自的权重相乘,最后将它们相加。

我写了以下存储过程:

CREATE PROCEDURE test ()  
BEGIN
DECLARE w1 DOUBLE;
DECLARE w2 DOUBLE;
DECLARE res1 DOUBLE;
DECLARE res2 DOUBLE;
DECLARE finres DOUBLE;
SELECT weight1 INTO w1 FROM weights;
SELECT weight2 INTO w2 FROM weights;
SELECT w1 * var1 INTO res1 FROM vartable;
SELECT w2 * var2 INTO res1 FROM vartable;
SELECT res1+res2 INTO finres;
SELECT MEAN(finres);
END
//

不幸的是,它还没有成功。最后它应该返回一个值,但所有这些只有在我将所有变量都放入 SELECT 查询时才有效。

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    根据mysql docu你必须声明你想要输出的参数

    喜欢

    CREATE PROCEDURE simpleproc (OUT param1 INT)
    

    将值存储在 param1 中并使用以下命令调用过程:

    CALL simpleproc(@a);
    

    并通过以下方式获取值:

    SELECT @a;
    

    这应该可以解决问题

    【讨论】:

    • 我选择了 INTO param1 的值。创建存储过程也不会导致错误,但 @ 仍然为 NULL。我做错了什么?
    【解决方案2】:

    对不起,我的第一个答案搞砸了,没有理解问题....

    您想计算权重乘以变量的平均值。但是在您的程序中,您只存储双打。所以你的平均计算超过一倍。恕我直言,这没有任何意义。例如。 5 的平均值? :-)

    你的表格里写的是什么?只有一排权重和一排变量?

    【讨论】:

    • :) 是的,标量的平均值并不那么聪明……我的数据表中有数据,权重表中有权重。现在我想将数据的 column1 乘以 weight1 等等。之后我想求和 (weightedcol1 +weightedcol2) ,它返回一个向量。最后一步是 AVG(result) - 是的 AVG 是正确的并不意味着 :) - 然后返回 AVG(result)
    • 你的意思是:select AVG(weight1*var1 + weight2*var2) from weights, vartable;为什么不在选择中做呢?
    • 实际上加权方案比描述的要复杂。 w1 * d1 = 数据1 w2 * d2 = 数据2 w3 * d3 = 数据3 w4 * d4 = 数据4 w5 * d5 = 数据5 中间1 = 数据1 中间2 = 数据2 + 数据5 中间3 = 数据3 + 数据4 结果 = 中间1 *w6 + 中间2*w7 + 中间3* w8 :) 我想要的只是返回结果。
    • 好的,我不确定在过程中存储向量/集合并使用它们有多容易。我会尝试在数据库查询中完成所有向量/集合的工作,并将标量存储在过程的变量中。如果在你的情况下是可能的。
    【解决方案3】:

    试试这样:

    SELECT AVG(W.weight1 * V.var1 + W.weight2 * V.var2) FROM weights W, vars V;
    

    【讨论】:

    • 查询会变得非常难看,因为我必须通过以下方式获得 weight1:SELECT weight FROM weights WHERE uid=1
    【解决方案4】:

    我明白了!以下确实有效:

    CREATE PROCEDURE test2 (IN period1 INT)
    BEGIN
    DECLARE x1 DOUBLE;
    DECLARE x2 DOUBLE;
    DECLARE param1 DOUBLE; 
    SELECT wvalue INTO x1 FROM weights WHERE uid=1;
    SELECT wvalue INTO x2 FROM weights WHERE uid=2;
    
    SELECT x1*x2 INTO param1;
    INSERT result_table(result,period) SELECT param1,period1;
    
    END
    //
    DELIMITER ;
    
    call test2 (@la);
    

    我可以以某种方式存储此结果吗?编辑:也想出了一个。将其存储在某个现有表中,请参阅编辑。

    【讨论】:

      猜你喜欢
      • 2014-06-17
      • 1970-01-01
      • 2014-03-07
      • 2015-06-19
      • 2013-08-05
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      相关资源
      最近更新 更多