【问题标题】:How to write loop in MySQL between two values?如何在 MySQL 中的两个值之间编写循环?
【发布时间】: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,则不确定这里的逻辑是否没有输出?
  • 我认为它应该跳过安东,然后转到下一个人。
  • 查询应该得到满足条件的名字

标签: mysql database loops database-cursor


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多