MySQL 通过另一个表的最小值更新一个表

标签 mysql sql-update

我想从表历史记录更新表租赁

CREATE TABLE Lease
    (`LeaseID` int, `Name` varchar(3), `Users` varchar(15), `WhoSignID` int, `NoteDate` date)
;
    
INSERT INTO Lease
    (`LeaseID`, `Name`, `Users`, `WhoSignID`, `NoteDate`)
VALUES
    (1, 'AAA', '1000,1001', NULL, NULL),
    (2, 'BBB', '1002', NULL, NULL),
    (3, 'CCC', '1003,1004', NULL, NULL),
    (4, 'DDD', '1005,1006, 1007', NULL, NULL)
;

CREATE TABLE History
    (`HistoryID` int, `LeaseID` int, `User` int, `SignDate` date)
;
    
INSERT INTO History
    (`HistoryID`, `LeaseID`, `User`, `SignDate`)
VALUES
    (1, 1, 1000, '2020-01-05'),
    (2, 1, 1001, '2020-01-04'),
    (3, 1, 1001, '2020-01-02'),
    (4, 1, 1000, '2020-01-03'),
    (6, 2, 1002, '2020-05-01'),
    (7, 2, 1002, '2020-05-03')
;

我正在寻找 Mysql 更新来更新表租赁: NoteDate 和 WhoSignID 基于 SignDate 和 User 其中用户签名日期的最小值

更新后的 table 租赁

LeaseID | Name | Users           | WhoSignID | NoteDate 
1       | AAA  | 1000,1001       | 1001      | 2020-01-02
2       | BBB  | 1002            | 1002      | 2020-05-01
...

感谢您的帮助

最佳答案

您的 Lease 表存在严重的设计问题,因为它将用户存储为 CSV 列表。相反,您应该将每个用户值放在单独的记录中。话虽这么说,看来 CSV 用户列表对您当前的问题并不重要,您当前的问题只需要找到每个租约的最早日期。如果是这样,那么一个简单的更新连接就足够了:

UPDATE Lease l
INNER JOIN
(
    SELECT h1.LeaseID, h1.User, h2.MinSignDate
    FROM History h1
    INNER JOIN
    (
        SELECT LeaseID, MIN(SignDate) AS MinSignDate
        FROM History
        GROUP BY LeaseID
    ) h2
        ON h2.LeaseID = h1.LeaseID AND
           h2.MinSignDate = h1.SignDate
) h
    ON h.LeaseID = l.LeaseID
SET
    WhoSignID = h.User,
    NoteDate = h.MinSignDate;

关于MySQL 通过另一个表的最小值更新一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66057591/

相关文章:

PHP 货币格式

mysql - 我在哪里可以找到我的 mySQL 数据库(使用 locate 没有帮助)?

PHP/MySQL 更新,忽略空/空白值

MySQL 使用 select 更新表中的多个列和记录

sql-server-2008 - SQL Server - 根据另一列值更新列

php - 不同的用户类型具有不同的数据

javascript - 唯一约束在约束 : `User_Account_userId_key` in prisma 上失败

mysql - SQL - 当用户注册时更新两个表

Select 中的 MYSQL 更新 - 在连接行时多次更新行

python - Web.py db.update() - 将字典作为参数传递,其中 AND 作为值列表