如何解决如何选择具有最新日期的行并根据该行计算另一个字段
我有两个表,即vehicle和vehicle_maintenance。
车辆
-----------------------------------
| v_id | v_name | v_no |
-----------------------------------
| 1 | car1 | car123 |
-----------------------------------
| 2 | car2 | car456 |
-----------------------------------
vehicle_maintenance
-----------------------------------------------------------------------
| v_main_id | v_id | v_main_date | v_main_remainder |
-----------------------------------------------------------------------
| 1 | 1 | 2020/10/10 | 1 |
| 2 | 1 | 2020/10/20 | 2 |
| 3 | 2 | 2020/10/04 | 365 |
| 4 | 2 | 2020/10/15 | 5 |
-----------------------------------------------------------------------
我想获取每辆汽车的维护详细信息,即car2维护日期为2020/10/15,并且我想根据v_main_remainder字段检查下一个维护日期。这意味着下一个维护日期将是2020/10/20(维护日期增加5天)。我还想计算下一个维护日期剩余的天数。假设今天是2020/10/10,那么它将显示剩余10天。
这是我的查询
SELECT
v.v_id,v.v_name,v.v_no,max(vm.v_main_date) as renewal_date,datediff(
DATE_ADD(
max(vm.v_main_date),INTERVAL +vm.v_main_remainder day
),now()
) as day_left
FROM vehicle as v,vehicle_maintenance as vm
GROUP BY v.v_id
但是问题是从第一行获取的date_add函数中的vm.v_main_remainder。
这是结果
-----------------------------------------------------------------------
| v_id | v_name | v_no | renewal_date | day_left |
-----------------------------------------------------------------------
| 1 | car1 | car123 | 2020/10/20 | 11 |
-----------------------------------------------------------------------
| 2 | car2 | car456 | 2020/10/15 | 370 |
-----------------------------------------------------------------------
解决方法
首先,您的查询显然缺少两个表之间的连接条件,所以这是笛卡尔乘积。使用显式联接时,这种类型的问题更容易发现。
然后:您要过滤每辆车的最新维护记录,因此不适合汇总。
一个选项使用MySQL 8.0中提供的窗口函数:
select v.v_id,v.v_name,v.v_no,vm.v_main_date as renewal_date,datediff(vm.v_main_date + interval vm.v_main_remainder day,current_date) as day_left
from vehicle as v
inner join (
select vm.*,row_number() over(partition by v_id order by v_main_date desc) rn
from vehicle_maintenance
) as vm on vm.v_id = v.v_id
where vm.rn = 1
请注意,我将now()
更改为current_date
,因此datediff()
在date
而不是datetime
上始终可以正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。