我上面有这些表格。
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日”。
我正在尝试为此创建一个查询,但直到现在还没有成功。
答案 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才能正确地更新记录。