【问题标题】:MySql sort order varchar as int, starting with characterMySql排序顺序varchar为int,以字符开头
【发布时间】:2015-02-05 15:36:24
【问题描述】:

我的数据库中有“名称”列,客户端输入的值如下:

样本 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。

提前致谢。

【问题讨论】:

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

标签: mysql sorting int varchar


【解决方案1】:

破解这段极其丑陋的代码...

取初始值并测试它是否包含' ' 字符。如果是,那么我们开始拆分该' ' 字符的索引,如果不是,则只返回初始值。为' ' 分隔字符串的每个其他可能性开始递归。这是为了允许 2 个以 ' ' 分隔的单词后跟一个数值,或者视情况而定。

这里的 SQL 小提琴:http://sqlfiddle.com/#!2/70168/7

查询:

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 ║ 第一部分 ║ 第二部分 ║ 第三部分 ║ ╠═══════════════╬═══════════╬════════════╬════════ ═══╣ ║ 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 ║ ╚═══════════════╩═══════════╩════════════╩════════ ═══╝

免责声明:此解决方案的性能或可扩展性都不是很好。通过另一种语言(例如PHPC#)执行此SUBSTRING 工作会为您提供更好的服务。这也会根据您在 cmets 中的陈述对您的数据做出一些假设。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2017-11-09
    • 2019-10-29
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多