已编辑
这似乎是将 DDS 理念转变为适用于所有 MySQL 版本的更通用的最简单方法..
查询
SELECT
id
, name
FROM
Table1
ORDER BY
CASE
WHEN name COLLATE latin1_bin BETWEEN 'A' AND 'Z'
THEN ASCII(name) + 31
ELSE ASCII(name)
END
结果
| id | name |
| --- | ---- |
| 4 | A |
| 1 | a |
| 5 | B |
| 2 | b |
| 6 | C |
| 3 | c |
View on DB Fiddle
Explaining View so you can see what happens on DB Fiddle
或者更稳定的一个,因为计算的_ascii_value 列的唯一生成值。
Explaining View so you can see what happens on DB Fiddle
另一个查询相当复杂..
查询
SELECT
Table1.id
, Table1.name
FROM (
SELECT
DISTINCT
(
SUBSTRING_INDEX(SUBSTRING_INDEX(@orderList, ',', number_generator.number), ',', -1)
COLLATE utf8mb4_bin
) AS letter
FROM (
SELECT
(@number := @number + 1) AS number
FROM (
SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS row_1
CROSS JOIN (
SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
) AS row_2
CROSS JOIN (SELECT @number := 0) AS init_user_param
) AS number_generator
CROSS JOIN (SELECT @orderList := 'A,a,B,b,C,c' /* add all to Z,z */) AS init_user_param
) AS letters
INNER JOIN
Table1
ON
letters.letter = Table1.name
;
结果
| id | name |
| --- | ---- |
| 4 | A |
| 1 | a |
| 5 | B |
| 2 | b |
| 6 | C |
| 3 | c |
View on DB Fiddle
注意有些事情你应该知道
当您的 MySQL 使用 utf8 字符集时,COLLATE utf8mb4_bin 可能会改为 COLLATE utf8_bin。
还有SELECT @orderList := 'A,a,B,b,C,c' /* add all to Z,z */,您需要向Z,z 添加更多内容