如何在 MySQL 中的两个值之间编写循环?

Posted

技术标签:

【中文标题】如何在 MySQL 中的两个值之间编写循环?【英文标题】:How to write loop in MySQL between two values? 【发布时间】:2022-01-14 03:14:47 【问题描述】:

我有桌子:

T1

| Name | score |
| John |   1   |
|Anton |   2   | 
|George|   8   | 
|Peter |   1   | 
| Tom  |   2   | 

我需要在两个值之间循环表格。

我需要创建一个过程或函数,为给定的 value1 和 value2 打印出(按字母顺序)总(分数)大于 value1 且小于 value2 的名称。

示例

对于 value1= 5 和 value2=12。

首先我需要按字母顺序对名称进行排序。

| Name | score |
|Anton |   2   | 
|George|   8   | 
| John |   1   |
|Piter |   1   | 
| Tom  |   2   |

由于 value1 是 5,value2 是 12,我需要循环直到 sum(score) 大于 5,小于 12。在这种情况下,结果应该是:

| Name | 
|Anton |   
|George|  
| John | 

因为他们总共得到超过 5 分且低于 12 分的分数。

【问题讨论】:

你的mysql版本是什么 我的版本是8.0.27 如果原始数据中只有 anton 并且得分为 12,则不确定这里的逻辑是否没有输出? 我认为它应该跳过安东,然后转到下一个人。 查询应该得到满足条件的名字 【参考方案1】:

1)丢弃分数> 12 2)锻炼累计和 3)在要求的范围内计算最大累计和 4)选择那些累计和是

DROP table if exists t;

create table t
( Name varchar(10), score int);
insert into t values
('Anton' ,   12),    
('George',   12),    
('John'  ,   1),   
('Piter' ,   1),    
('Tom'   ,   2),
('bilal' ,   5)
;   

with 
cte as
(select t.*,
         sum(score) over (order by name) cumsum
from t
where score < 12) ,
cte1 as
(select max(cumsum) maxcumsum from cte where cumsum < 12 and cumsum > 5),
cte2 as
(select  cte.*,cte1.maxcumsum
from cte
cross join cte1)

select * from cte2 
where maxcumsum > 5 and cumsum <= maxcumsum
order by name;

+-------+-------+--------+-----------+
| Name  | score | cumsum | maxcumsum |
+-------+-------+--------+-----------+
| bilal |     5 |      5 |         9 |
| John  |     1 |      6 |         9 |
| Piter |     1 |      7 |         9 |
| Tom   |     2 |      9 |         9 |
+-------+-------+--------+-----------+
4 rows in set (0.022 sec)

【讨论】:

以上是关于如何在 MySQL 中的两个值之间编写循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中的两个日期之间获取特定日期

如何编写mysql触发器

如何使用数据库(mysql)中的gps位置在两个地理点之间找到pople?

如何在 MySQL 中的两个表之间进行两次连接,以使它们相互链接?

如何找到三个(for循环)之间的最小值?

如何在“PARTITIONED BY”子句的括号之间以逗号分隔的tick中提取值