Bài toán
Sắp xếp kết quả so cho các dòng chứa từ khóa cụ thể xuất hiện đầu tiên, trong đó ưu tiên từ khóa quan trọng hơn.
Ví dụ
Bảng DemoTable602 chứa tên game:
CREATE TABLE DemoTable602 (GameName TEXT);
INSERT INTO DemoTable602 VALUES
('Candy cash game'), ('Pubg'), ('cash Candy game'), ('subway');
Mục tiêu: Ưu tiên có từ "Candy", sau đó ưu tiên có từ "cash".
Truy vấn dùng CASE + INSTR
SELECT * FROM DemoTable602
ORDER BY
CASE WHEN INSTR(GameName, 'Candy') = 0 THEN 1 ELSE 0 END,
INSTR(GameName, 'cash') DESC;
Kết quả:
+-----------------+
| GameName |
+-----------------+
| Candy cash game |
| cash Candy game |
| Pubg |
| subway |
+-----------------+
Giải thích
INSTR(str, substr): Trả về vị trí xuất hiện đầu tiên (1-based), trả về 0 nếu không tìm thấy.CASE WHEN INSTR(...) = 0 THEN 1 ELSE 0 END: Dòng có "Candy" → 0 (xuất hiện trước), không có → 1 (xuất hiện sau).INSTR(GameName, 'cash') DESC: Vị trí càng nhỏ (xuất hiện sớm) → giá trị càng nhỏ → nhưng DESC đảo ngược nên xuất hiện trước. Hoặc dùng-INSTR(...).
Mở rộng: Nhiều từ khóa với trọng số
SELECT *,
(CASE WHEN INSTR(GameName, 'Candy') > 0 THEN 10 ELSE 0 END) +
(CASE WHEN INSTR(GameName, 'cash') > 0 THEN 5 ELSE 0 END) AS score
FROM DemoTable602
ORDER BY score DESC, GameName;
Lưu ý hiệu năng
INSTR/LIKEkhông dùng được index (full table scan).- Với dữ liệu lớn, cân nhắc Full-Text Search (
MATCH() AGAINST()) hoặc Elasticsearch. - Case-insensitive: MySQL default collation (utf8_general_ci) đã case-insensitive.