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ĩa | Ví dụ |
|---|---|---|
GREATEST(a,b,c) | Giá trị lớn nhất | GREATEST(10, 20, 5) = 20 |
LEAST(a,b,c) | Giá trị nhỏ nhất | LEAST(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ùngCOALESCE()hoặcIFNULL()- 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;