mysql的表显示滚屏_mysql-滚动更改的SQL查询

本文介绍了一个具体的MySQL查询案例,旨在获取每个时间段对应的金额。通过左连接和变量的方式解决了只有当金额发生变化时才会记录的问题。

我有以下两个表:

1)表名:期间

+----------+

| PeriodID |

+----------+

| 1 |

| 2 |

| 3 |

| 4 |

+----------+

2)表名:值

+-------------+--------+

| StartPeriod | Amount |

+-------------+--------+

| 1 | 100 |

| 3 | 200 |

+-------------+--------+

第一个表表示时间段,例如月份.第二张表代表每个月的金额,但仅在与上个月不同时.金额从100开始,在期间2保持在100,然后从期间3开始跳升至200,之后保持在200.

我需要一个查询(MySQL)以返回每个期间的金额,如下所示:

+----------+--------+

| PeriodID | Amount |

+----------+--------+

| 1 | 100 |

| 2 | 100 |

| 3 | 200 |

| 4 | 200 |

+----------+--------+

因此,查询将返回小于或等于PeriodID的值表中最新StartPeriod的金额.例如,对于PeriodID 2,它将返回StartPeriod 1的金额,因为StartPeriod2没有任何值,并且1是小于或等于2且在值表中具有Amount的最大数字.

(对不起,桌子太丑了)

谢谢!

解决方法:

您可以使用相关子查询来做到这一点:

SELECT PeriodID,

(SELECT Amount

FROM Value

WHERE StartPeriod <= PeriodID

ORDER BY StartPeriod DESC LIMIT 1) AS Amount

FROM Period AS p

与相关子查询相比,使用变量执行起来可能更好:

SELECT PeriodID,

@amount := IF(Amount IS NOT NULL, Amount, @amount) AS Amount

FROM (

SELECT PeriodID, Amount

FROM Period AS p

LEFT JOIN Value AS v ON p.PeriodID = v.StartPeriod) AS t

CROSS JOIN (SELECT @amount := -1) AS var

ORDER BY PeriodID

标签:mysql

来源: https://codeday.me/bug/20191119/2037594.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值