Vấn đề
Muốn sắp xếp các chuỗi có tiền tố 'John_' (có dấu gạch dưới) lên đầu, các chuỗi khác sau đó (ngẫu nhiên).
Giải pháp: ORDER BY biểu thức boolean + RAND()
ORDER BY (Name LIKE 'John_%') DESC, RAND()
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (Name VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES
('John_Smith'), ('Chris Brown'), ('John_Doe'), ('David Miller'), ('Carol Taylor');
Truy vấn
mysql> SELECT * FROM DemoTable ORDER BY (Name LIKE 'John_%') DESC, RAND();
Kết quả (ví dụ)
+--------------+ | Name | +--------------+ | John_Doe | -- Khớp 'John_%' → TRUE (1) → lên đầu | John_Smith | -- Khớp 'John_%' → TRUE (1) → lên đầu | Carol Taylor | -- FALSE (0) → sau, RAND() sắp ngẫu nhiên | David Miller | | Chris Brown | +--------------+
Giải thích
Name LIKE 'John_%': TRUE (1) nếu tên bắt đầu bằng 'John_'. Dấu_trong LIKE khớp đúng 1 ký tự. Để khớp literal '_', dùng'John\_%'(escape).DESC: TRUE (1) > FALSE (0) → nhóm khớp lên đầu.RAND(): Sắp xếp ngẫu nhiên trong từng nhóm.
Các biến thể
Sắp xếp nhóm khớp theo tên, nhóm khác ngẫu nhiên
ORDER BY (Name LIKE 'John\_%') DESC,
CASE WHEN Name LIKE 'John\_%' THEN Name END,
RAND()
Nhiều nhóm ưu tiên
ORDER BY
CASE
WHEN Name LIKE 'John\_%' THEN 3
WHEN Name LIKE 'Admin\_%' THEN 2
ELSE 1
END DESC, Name
Lưu ý
RAND()khiến query không dùng index, chậm trên bảng lớn.- Escape
_trong LIKE:'John\_%'(backslash) hoặc'John$_%'ESCAPE '$'.