Để lấy các hàng khớp với ít nhất một số lượng điều kiện nhất định (ví dụ: 3 trên 4 điều kiện), bạn có thể dùng câu lệnh CASE để tính điểm cho từng điều kiện rồi lọc theo tổng điểm.
Cú pháp chung
SELECT * FROM ten_bang
WHERE
(CASE WHEN dieu_kien_1 THEN 1 ELSE 0 END) +
(CASE WHEN dieu_kien_2 THEN 1 ELSE 0 END) +
(CASE WHEN dieu_kien_3 THEN 1 ELSE 0 END) +
(CASE WHEN dieu_kien_4 THEN 1 ELSE 0 END) >= 3;
Ví dụ minh họa: Tìm user khớp ≥ 3/4 tiêu chí
1. Tạo bảng
CREATE TABLE UserInformation (
Id INT NOT NULL AUTO_INCREMENT,
FirstName VARCHAR(20),
LastName VARCHAR(20),
Age INT,
Marks INT,
PRIMARY KEY(Id)
);
2. Chèn dữ liệu
INSERT INTO UserInformation(FirstName, LastName, Age, Marks) VALUES
('John', 'Smith', 22, 89),
('Carol', 'Taylor', 21, 80),
('John', 'Doe', 24, 81),
('David', 'Miller', 29, 99),
('Mitchell', 'Johnson', 22, 65);
3. Truy vấn: Tìm user khớp ít nhất 3 trong 4 điều kiện:
- FirstName = 'Mitchell'
- LastName = 'Johnson'
- Age = 22
- Marks = 67
SELECT * FROM UserInformation
WHERE
(CASE WHEN FirstName = 'Mitchell' THEN 1 ELSE 0 END) +
(CASE WHEN LastName = 'Johnson' THEN 1 ELSE 0 END) +
(CASE WHEN Age = 22 THEN 1 ELSE 0 END) +
(CASE WHEN Marks = 67 THEN 1 ELSE 0 END) >= 3;
Kết quả:
+----+-----------+----------+------+-------+
| Id | FirstName | LastName | Age | Marks |
+----+-----------+----------+------+-------+
| 5 | Mitchell | Johnson | 22 | 65 |
+----+-----------+----------+------+-------+
User Mitchell khớp 3 điều kiện: FirstName, LastName, Age (Marks = 65 ≠ 67).
Cách viết gọn hơn (MySQL cho phép TRUE = 1, FALSE = 0)
SELECT * FROM UserInformation
WHERE
(FirstName = 'Mitchell') +
(LastName = 'Johnson') +
(Age = 22) +
(Marks = 67) >= 3;
Trong MySQL, biểu thức logic trả về 1 (TRUE) hoặc 0 (FALSE), có thể cộng trực tiếp.
Ứng dụng thực tế
- Tìm kiếm mờ (fuzzy search) với ngưỡng khớp
- Hệ thống gợi ý dựa trên nhiều tiêu chí
- Phân loại dữ liệu đa điều kiện