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

Sắp xếp chuỗi có dấu gạch dưới (_) lên đầu trong MySQL


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 '$'.