gpt4 book ai didi

mysql - 通过 Procedure 在 MySQL 中进行算术运算

转载 作者:行者123 更新时间:2023-11-29 06:36:05 25 4
gpt4 key购买 nike

我有一个表 t1,其中有一列 Marks,此列中的值是 10、20、30、40。

现在我想用一个过程来得到这个结果:

总分 Total_Marks

10 10

20 30

30 60

40 100

DELIMITER //

CREATE PROCEDURE Total_Marks ( In Num Int(4) )
Begin

Declare Mark Int(4);
Declare Add_M Int(4);
DECLARE NO_MORE_ROWS BOOLEAN;

DECLARE DataCursor CURSOR FOR SELECT Marks
FROM t1 where marks = Num;

DECLARE DataCursor1 CURSOR FOR SELECT Sum(Marks) FROM t1;

OPEN DataCursor;
FETCH DataCursor INTO Mark;
CLOSE DataCursor;

OPEN DataCursor1;
READ_LOOP1: LOOP
FETCH DataCursor1 INTO Add_M;
IF NO_MORE_ROWS THEN
LEAVE READ_LOOP1;
END IF;
BEGIN
SET Add_M = SUM(Mark);
END;
END LOOP READ_LOOP1;
CLOSE dataCursor1;

SET NO_MORE_ROWS = FALSE;

end //

DELIMITER ;

最佳答案

您根本不需要过程,更不用说游标了。但是您需要的是一个列,它定义了评论中提到的行的顺序。

create table foo (id int auto_increment primary key, bar int);
insert into foo(bar) values (10), (20), (30), (40);

在这个例子中,我为此引入了列id。或者,您当然可以根据自己的评分或任何适合您需要的方式进行订购。

select
bar
, @total := @total + bar as my_total
from
foo
, (select @total := 0) var_init
order by id

作为解释,使用这个交叉连接查询

, (select @total := 0) var_init

我们初始化我们的变量保存运行总计@total。和写一样

set @total = 0;
select
bar
, @total := @total + bar as my_total
from
foo
order by id;

我想剩下的就是不言自明了。

您可以阅读有关这些类型变量的更多信息 here .

更新(为了完整性):

这里有另外两种可能性如何在没有变量的情况下解决它。虽然我通常更喜欢变量,因为在这个中

select
t1.bar
, sum(t2.bar)
from
foo t1
inner join foo t2 on t1.id >= t2.id
group by t1.id;

您最终会得到一个可能非常庞大的临时表,因为您将每一行连接到所有之前的行,然后计算总和。

在这个解决方案中

select
bar
, (select sum(bar) from foo sf where sf.id <= foo.id) as my_total
from
foo;

您为每一行执行了一个依赖子查询。这比以前的解决方案更糟糕。

我发布这些只是为了完整性,如果你真的不能使用变量(例如因为创建 View )。

关于mysql - 通过 Procedure 在 MySQL 中进行算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24671786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com