Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cập nhật thời gian đăng nhập cho người dùng cụ thể trong MySQL

Vấn đề: Cập nhật thời gian đăng nhập gần nhất cho một user

Bảng lưu nhiều lần đăng nhập của cùng user. Cần cập nhật UserLoggedInTime cho user 'Carol' – nhưng chỉ cập nhật hàng gần nhất (theo UserId giảm dần).

Giải pháp: UPDATE với ORDER BY và LIMIT

MySQL cho phép ORDER BY và LIMIT trong UPDATE để kiểm soát hàng bị ảnh hưởng.

1. Tạo bảng và dữ liệu

CREATE TABLE DemoTable (
    UserId INT,
    UserLoggedInTime TIME,
    UserName VARCHAR(20)
);

INSERT INTO DemoTable VALUES
(100, '07:32:00', 'Chris'),
(101, '05:00:00', 'David'),
(102, '06:10:20', 'Mike'),
(103, '03:55:00', 'Carol');

2. Cập nhật cho Carol (hàng cuối theo UserId)

UPDATE DemoTable 
SET UserLoggedInTime = '12:30:45' 
WHERE UserName = 'Carol' 
ORDER BY UserId DESC 
LIMIT 1;

3. Kết quả

+--------+------------------+----------+
| UserId | UserLoggedInTime | UserName |
+--------+------------------+----------+
|    100 | 07:32:00         | Chris    |
|    101 | 05:00:00         | David    |
|    102 | 06:10:20         | Mike     |
|    103 | 12:30:45         | Carol    |
+--------+------------------+----------+

Tại sao cần ORDER BY + LIMIT?

  • Nếu có nhiều hàng cho 'Carol', ORDER BY UserId DESC LIMIT 1 đảm bảo chỉ cập nhật hàng mới nhất (UserId lớn nhất).
  • Nếu không có ORDER BY, MySQL có thể cập nhật hàng bất kỳ khớp điều kiện – không xác định.

Cách tốt hơn: Thiết kế bảng log

Thay vì cập nhật, nên INSERT hàng mới cho mỗi lần đăng nhập:

CREATE TABLE UserLoginLog (
    LogId BIGINT AUTO_INCREMENT PRIMARY KEY,
    UserId INT,
    LoginTime DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- Mỗi lần login: INSERT INTO UserLoginLog (UserId) VALUES (103);
-- Lấy lần gần nhất: SELECT * FROM UserLoginLog WHERE UserId=103 ORDER BY LoginTime DESC LIMIT 1;

Ưu điểm: Giữ lịch sử, tránh khóa hàng, hỗ trợ kiểm toán.