mysql - mysql数据如何排序在数字后的第一个字母

标签 mysql

我有一个包含如下数据的表格,我尝试通过多种选项进行排序,但总是有些想法是错误的。我的 sql 结果:

select type from types
order by type ASN;

TYPE 1
TYPE 10
TYPE 11
TYPE 12
TYPE 13
TYPE 14
TYPE 15
TYPE 16
TYPE 17
TYPE 18
TYPE 19
TYPE 2
TYPE 20
TYPE 21

你怎么看“TYPE 2”在类型 19 下,我想得到如下结果

TYPE 1
TYPE 2
TYPE 10
TYPE 11
TYPE 12
TYPE 13
TYPE 14
TYPE 15
TYPE 16
TYPE 17
TYPE 18
TYPE 19
TYPE 20
TYPE 21

我表中的数据有不同的类型,不总是 4 个字母,有时有 3 个字母,但总是在字母和数字之间留一个空格

最佳答案

如果您只有一个单词后跟一个数字的数据,您可以使用 substring_index 在空格处拆分您的字符串。然后您可以按这两个不同的值进行排序。请注意,您需要将数字转换为 int,以便 MySQL 对其进行数字排序,而不是字母数字排序。

select 
  *
from types
order by
  substring_index(type, " ", 1),
  convert(substring_index(type, " ", -1), signed int)

编辑:我应该指出,我不建议简单地按长度排序的原因是因为 OP 说 type 列值的长度是可变的( 3 或 4 个字符)。

如果您的数字前有完全相同的前缀(例如,如果它始终是“type ###”),通常会建议使用这种方法:

order by char_length(type), type

关于mysql - mysql数据如何排序在数字后的第一个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51563118/

相关文章:

php - 查找并删除后面的重复记录

php - 表不会更新,但显示成功

mysql - 构建一个 SQL 来计算与父项相关的行数

php - 使用数组的 mysqli 参数化查询

php - 仅在某些条件下将行插入 MYSQL 数据库

php - Cakephp不更新模型

mysql - 根据 Hive 中另一个表中的时间戳在表中查找记录

mysql - 如何抑制连续的重复记录?

php - 查询生成器 Codeigniter 3

mysql - 查找连续记录的数量