【问题标题】:Update records based on date on MySQL using joins使用连接根据 MySQL 上的日期更新记录
【发布时间】:2018-07-26 02:44:15
【问题描述】:

上面的表格我都有。

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 。

在这种情况下,模型 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-03-10”。

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

【问题讨论】:

  • 如果你能展示你已经有什么查询,这通常会受到读者的欢迎。它不一定要工作,但它很有用,因为它会显示您的思路,并且读者将更好地了解您需要学习的具体内容。你现在会这样做吗?

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


【解决方案1】:

您需要嵌套一个分组查询,以获取每个模型的 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 作为表别名。

为清楚起见,MAX 日期也已重命名为 check_date。您当然可以随意命名。

【讨论】:

  • 如果这个答案有帮助,请考虑投票给它,以及对您有帮助的任何其他答案,以便其他人可以找到最合适的解决方案。
【解决方案2】:

带子查询:

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"

【讨论】:

    【解决方案3】:

    @tyro - 请注意您的解决方案,因为当 car_service_tbl 中没有服务日期时,LEFT JOIN 会将服务状态更新为 0。您需要使用完全联接,而不仅仅是您建议的 LEFT JOIN,以便正确更新记录。

    【讨论】:

    • 错误地将其作为答案而不是评论
    • 不是一个错误 - SO 的规则,除非您在自己的帖子上发表评论,否则在达到 50 代表之前您不能发表评论......不过,感谢您的反馈。一旦达到令人眼花缭乱的 50 次重复次数,我一定会遵守规则!
    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多