MySql将varchar排序为int,以字符开头

MySql将varchar排序为int,以字符开头,mysql,sorting,int,varchar,Mysql,Sorting,Int,Varchar,我的数据库中有“name”列,客户机在其中输入如下值: 样品1、样品2、样品101、样品11、样品20、样品100、部分样品、活性样品等 因此,当我想按此列对数据进行排序时,结果是: active sample sample 1 sample 100 sample 101 sample 11 sample 2 sample 20 some sample 反而 active sample sample 1 sample 2 sample 11 sample 20 sample 100 samp

我的数据库中有“name”列,客户机在其中输入如下值:

样品1、样品2、样品101、样品11、样品20、样品100、部分样品、活性样品等

因此,当我想按此列对数据进行排序时,结果是:

active sample
sample 1
sample 100
sample 101
sample 11
sample 2
sample 20
some sample 
反而

active sample
sample 1
sample 2
sample 11
sample 20
sample 100
sample 101
some sample
所以,数据从不以数字开头,有时以数字结尾,但有时根本不以数字结尾。 按字母顺序排列很重要,但当数据包含相同的前缀时,它应该按int顺序排列值


提前感谢。

将这段极其难看的代码分解

获取初始值并测试它是否包含
'
字符。如果是,那么我们开始对
'
字符的索引进行拆分,如果不是,那么只返回初始值。对于
''
分隔字符串的每个附加可能性,开始递归。这是为了允许2个“”分隔的单词后跟一个数值,或者根据具体情况而定

SQL Fiddle在此:

查询:

SELECT 
   sampleInfo,

   IF (LOCATE(' ', sampleInfo) > 0,
       SUBSTRING(sampleInfo, 1, LOCATE(' ', sampleInfo) - 1),
       sampleInfo) AS firstPart,

   IF (LOCATE(' ', sampleInfo) > 0,
       IF (LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) > 0,          
           SUBSTRING(
             SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1),
             1,
             LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) - 1),
           SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)),
           0) AS secondPart,

   IF (LOCATE(' ', sampleInfo) > 0,
       IF (LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) > 0,
           SUBSTRING(
             SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1),
             LOCATE(' ', SUBSTRING(sampleInfo, LOCATE(' ', sampleInfo) + 1)) + 1),
           0),
       0) AS thirdPart    

FROM test
ORDER BY 
  firstPart,
  thirdPart,
  CONVERT(secondPart, SIGNED) --if conversion fails the value is 0
结果:

╔═══════════════╦═══════════╦════════════╦═══════════╗ ║ SAMPLEINFO ║ FIRSTPART ║ SECONDPART ║ THIRDPART ║ ╠═══════════════╬═══════════╬════════════╬═══════════╣ ║ asdf 1 ║ asdf ║ 1 ║ 0 ║ ║ asdf 2 ║ asdf ║ 2 ║ 0 ║ ║ sample ║ sample ║ 0 ║ 0 ║ ║ sample 1 ║ sample ║ 1 ║ 0 ║ ║ sample 2 ║ sample ║ 2 ║ 0 ║ ║ sample 11 ║ sample ║ 11 ║ 0 ║ ║ sample 20 ║ sample ║ 20 ║ 0 ║ ║ sample 100 ║ sample ║ 100 ║ 0 ║ ║ sample 101 ║ sample ║ 101 ║ 0 ║ ║ sample test 1 ║ sample ║ test ║ 1 ║ ║ sample test 2 ║ sample ║ test ║ 2 ║ ╚═══════════════╩═══════════╩════════════╩═══════════╝ ╔═══════════════╦═══════════╦════════════╦═══════════╗ ║ 样本信息║ 第一部分║ 第二部分║ 第三部分║ ╠═══════════════╬═══════════╬════════════╬═══════════╣ ║ asdf 1║ asdf║ 1.║ 0║ ║ asdf 2║ asdf║ 2.║ 0║ ║ 样品║ 样品║ 0║ 0║ ║ 样本1║ 样品║ 1.║ 0║ ║ 样本2║ 样品║ 2.║ 0║ ║ 样本11║ 样品║ 11║ 0║ ║ 样本20║ 样品║ 20║ 0║ ║ 样本100║ 样品║ 100║ 0║ ║ 样本101║ 样品║ 101║ 0║ ║ 样本测试1║ 样品║ 测验║ 1.║ ║ 样本测试2║ 样品║ 测验║ 2.║ ╚═══════════════╩═══════════╩════════════╩═══════════╝
免责声明:此解决方案的性能或可扩展性不高。通过另一种语言(如
PHP
C
)执行此
SUBSTRING
工作会更好,举几个例子。这也会根据您在评论中的陈述对您的数据做出一些假设。

如果数据包含一个数字,是否总是用空格分隔?此外,数据是否可以像
sample 123 moretext
?是的,它总是分开的,但数字前可以有多个单词。我仍然没有找到像“sample 123 moretext”这样的数据。你希望没有数字的前缀排在第一还是最后?嗨,迈克尔,如果它们排在第一会更好。