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ênLENGTH - INSTR: Độ dài phần sau dấu '-'RIGHT(..., LENGTH - INSTR): Trích xuất hậu tố- Nếu không có '-',
INSTRtrả 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.