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

Sắp xếp theo hậu tố chuỗi (sau dấu gạch ngang) trong MySQL

Giới thiệu

Sắp xếp các chuỗi có hậu tố phân cách bằng dấu gạch ngang (ví dụ: 'John-D', 'John-Smith') theo phần hậu tố, đặt các chuỗi không có hậu tố lên đầu.

1. Tạo bảng và dữ liệu

mysql> create table DemoTable (
    -> ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ClientName varchar(20)
    -> ); 
Query OK, 0 rows affected (0.54 sec)

mysql> insert into DemoTable(ClientName) values('Mike'); 
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(ClientName) values('John'); 
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable(ClientName) values('John-D'); 
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(ClientName) values('John-Smith'); 
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(ClientName) values('Mike-Smith'); 
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(ClientName) values('Mike-D'); 
Query OK, 1 row affected (0.15 sec)

2. Dữ liệu gốc

mysql> select *from DemoTable;
+----------+------------+
| ClientId | ClientName |
+----------+------------+
|        1 | Mike       |
|        2 | John       |
|        3 | John-D     |
|        4 | John-Smith |
|        5 | Mike-Smith |
|        6 | Mike-D     |
+----------+------------+
6 rows in set (0.00 sec)

3. Truy vấn sắp xếp theo hậu tố

mysql> select 
    -> case 
    ->     when right(ClientName, length(ClientName) - instr(ClientName, '-')) = ClientName THEN ''
    ->     else right(ClientName, length(ClientName) - INSTR(ClientName, '-'))
    -> end as `last`,
    -> `ClientName`
    -> from DemoTable
    -> ORDER BY `last`, `ClientName`;

Logic:

  • INSTR(ClientName, '-'): Vị trí dấu '-' đầu tiên
  • LENGTH - INSTR: Độ dài phần sau dấu '-'
  • RIGHT(..., LENGTH - INSTR): Trích xuất hậu tố
  • Nếu không có '-', INSTR trả về 0 → RIGHT(..., LENGTH) = toàn bộ chuỗi → điều kiện = ClientName đúng → gán rỗng ''
  • Sắp xếp: rỗng trước, rồi 'D', rồi 'Smith', trong mỗi nhóm sắp theo tên

4. Kết quả

+-------+------------+
| last  | ClientName |
+-------+------------+
|       | John       |
|       | Mike       |
| D     | John-D     |
| D     | Mike-D     |
| Smith | John-Smith |
| Smith | Mike-Smith |
+-------+------------+
6 rows in set (0.00 sec)

Cách đơn giản hơn (MySQL 8.0+): Dùng SUBSTRING_INDEX(ClientName, '-', -1) lấy phần sau dấu '-' cuối cùng.