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

Lấy MAX() từ cột trên hai bảng MySQL?

Giải pháp: GREATEST() với subquery

Hàm GREATEST(val1, val2, ...) trả về giá trị lớn nhất trong danh sách. Kết hợp subquery lấy MAX từ mỗi bảng.

Ví dụ minh họa

Tạo 2 bảng

mysql> CREATE TABLE DemoTable1 (Number INT);
mysql> INSERT INTO DemoTable1 VALUES(80), (229), (575);

mysql> CREATE TABLE DemoTable2 (Number INT);
mysql> INSERT INTO DemoTable2 VALUES(485), (10), (475);

Dữ liệu

DemoTable1: 80, 229, 575  → MAX = 575
DemoTable2: 485, 10, 475  → MAX = 485

Truy vấn GREATEST

mysql> SELECT GREATEST(
    ->     (SELECT MAX(Number) FROM DemoTable1),
    ->     (SELECT MAX(Number) FROM DemoTable2)
    -> ) AS MaximumValue;

Kết quả

+--------------+
| MaximumValue |
+--------------+
| 575          |
+--------------+

Các cách khác

UNION ALL + MAX (chuẩn SQL hơn)

SELECT MAX(Number) FROM (
    SELECT Number FROM DemoTable1
    UNION ALL
    SELECT Number FROM DemoTable2
) AS combined;

JOIN (nếu có khóa liên kết)

-- Không áp dụng cho ví dụ này (không có khóa chung)

GREATEST() vs LEAST()

HàmÝ nghĩaVí dụ
GREATEST(a,b,c)Giá trị lớn nhấtGREATEST(10, 20, 5) = 20
LEAST(a,b,c)Giá trị nhỏ nhấtLEAST(10, 20, 5) = 5

Lưu ý GREATEST/LEAST

  • Trả về NULL nếu bất kỳ tham số nào là NULL
  • GREATEST(10, NULL) = NULL → Dùng COALESCE() hoặc IFNULL()
  • So sánh theo kiểu dữ liệu chung (type conversion)

Mở rộng: N bảng

SELECT GREATEST(
    (SELECT MAX(val) FROM table1),
    (SELECT MAX(val) FROM table2),
    (SELECT MAX(val) FROM table3),
    (SELECT MAX(val) FROM table4)
) AS overall_max;

Ứng dụng: Tìm max timestamp nhiều bảng log

SELECT GREATEST(
    (SELECT MAX(created_at) FROM logs_web),
    (SELECT MAX(created_at) FROM logs_api),
    (SELECT MAX(created_at) FROM logs_mobile)
) AS latest_activity;