使用连接基于MySQL的日期更新记录

时间:2018-02-15 11:00:54

标签: mysql join sql-update left-join inner-join

我上面有这些表格。

car_model_tbl

----------------------------- 
id  | car_model_name|status |
----------------------------- 
1   |   seria_1     |   1   |
----------------------------- 
2   |   golf_4      |   1   |
----------------------------- 
3   |   C_Class     |   1   |
----------------------------- 
4   |   golf_5      |   1   |
----------------------------- 
5   |   seria_2     |   0   |   
----------------------------- 

car_manufacturer_tbl

------------------------- 
id  |car_manufactu_name |   
------------------------- 
1   |   bmw             |   
------------------------- 
2   |   volkswagen      |   
------------------------- 
3   |   mercedes        |       
------------------------- 

car_service_tbl

--------------------------------- 
id  |   model_id| service_date  |   
--------------------------------- 
1   |   1       |   2018-03-10  |
--------------------------------- 
2   |   2       |   2018-02-10  |
--------------------------------- 
3   |   1       |   2018-01-10  |
---------------------------------
4   |   1       |   2017-12-10  |
--------------------------------- 
5   |   2       |   2017-12-10  |
--------------------------------- 
6   |   3       |   2018-02-10  |
--------------------------------- 
7   |   2       |   2018-01-10  |
--------------------------------- 
9   |   4       |   2018-03-10  |
--------------------------------- 
10  |   4       |   2018-02-10  |
--------------------------------- 
11  |   5       |   2018-02-10  |
--------------------------------- 

car_model_manufacturer_relation

-------------------------------------------------
id  | model_id  | manufactu_id| service_status  |
-------------------------------------------------
1   |   1       |   1         | 1               |
-------------------------------------------------
2   |   5       |   1         | 1               |
-------------------------------------------------
3   |   2       |   2         | 1               |
-------------------------------------------------
4   |   4       |   1         | 1               |
-------------------------------------------------
5   |   2       |   2         | 1               |
-------------------------------------------------
6   |   3       |   3         | 1               |
-------------------------------------------------

我需要更新 car_model_manufacturer_relation.service_status ='0' 其中 car_service_tbl.service_date< “2018年3月1日”即可。

在这种情况下,模型2,3和5的 car_model_manufacturer_relation.service_status 应设置为'0',因为每个 car_service_tbl.service_date 这些型号小于“2018-03-01”。

但是,对于模型1和模型4, car_model_manufacturer_relation.service_status 应保持'1',因为即使他们的记录小于“2018-03-01”,他们也有更大的日期。 “2018年3月10日”。

我正在尝试为此创建一个查询,但直到现在还没有成功。

3 个答案:

答案 0 :(得分:0)

您需要嵌套分组查询,以获取每个模型的MAX日期,并从中进行更新。

update car_model_manufacturer_relation as cmmr, 
    (select model_id, max(service_date) as check_date 
        from car_service_tbl 
        group by model_id) as cst 
set cmmr.service_status = '0' 
where cmmr.model_id = cst.model_id 
and cst.check_date < "2018-03-01" 

如果您使用多个表并且表名包含下划线,我会尝试对表进行别名以使代码更短更容易,因此使用cmmr和cst作为表别名。< / p>

为了清晰起见,MAX日期也已重命名为check_date。你当然可以任意命名。

答案 1 :(得分:0)

使用子查询:

UPDATE car_model_manufacturer_relation c
LEFT join (SELECT model_id, service_date FROM car_service_tbl ORDER BY service_date DESC LIMIT 1) as s  ON s.model_id = c.model_id
SET service_status=0
WHERE c.service_date < "2018-03-01"

答案 2 :(得分:0)

@tyro - 请小心您的解决方案,因为当car_service_tbl中没有服务日期时,LEFT JOIN会将服务状态更新为0。你需要使用一个完整的连接,而不是你建议的LEFT JOIN才能正确地更新记录。