Mysql 使用字符串和整数组合排序

Mysql Order by with string and integer combination

我在 mysql 中有一列 table 包含不同类型的值...

A-1

A-2

B-7

AA-1

B-1

C-2

所有行中唯一常见的是“-”。

但是我想重新排列所有值是这样的...

A-1

A-2

AA-1

B-1

B-7

C-2

我尝试了几个流程订单,例如

ORDER BY col+0

ORDER BY cast(col as unsigned)

ORDER BY length(col),col

ORDER BY CAST(col AS SIGNED) ASC

ORDER BY ABS(col)

None 其中的工作按预期进行。有什么想法吗?

这会起作用:

ORDER BY SUBSTRING_INDEX(col, '-', 1), 
    CAST(SUBSTRING_INDEX(col, '-', -1) AS UNSIGNED)

在此处阅读有关此功能的更多信息:https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index

但是,这对性能不利,因为它必须为每一行生成这些子字符串,然后手动对它们进行排序。

如果您使用 MySQL 5.7 或更高版本,您可以为它们创建虚拟列和索引:

ALTER TABLE MyTable
  ADD COLUMN col_field1 VARCHAR(2), AS (SUBSTRING_INDEX(col, '-', 1)),
  ADD COLUMN col_field2 INT UNSIGNED AS (SUBSTRING_INDEX(col, '-', -1)),
  ADD INDEX (col_field1, col_field2);

然后您可以按索引虚拟列排序:

ORDER BY col_field1, col_field2