如何在 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)中的gps位置在两个地理点之间找到pople?