【问题标题】:custom sort in mysqlmysql中的自定义排序
【发布时间】:2013-04-09 06:50:56
【问题描述】:

下面的数据是一个按升序排列的字符串列:

1/44/104/66
1/44/104/66/137
1/44/104/66/138
1/44/104/66/139
1/44/104/66/140
1/44/104/66/141
1/44/104/66/142
1/44/104/66/143
1/44/104/66/67
1/44/104/66/68
1/44/104/66/69

但我想这样排序:

1/44/104/66
1/44/104/66/67
1/44/104/66/68
1/44/104/66/69
1/44/104/66/137
1/44/104/66/138
1/44/104/66/139
1/44/104/66/140
1/44/104/66/141
1/44/104/66/142
1/44/104/66/143

【问题讨论】:

标签: mysql sql database sorting


【解决方案1】:

对于您拥有的数据,这应该有效:

order by length(col), col

但是,这假设唯一的区别在于最后一列。

【讨论】:

  • 如果字符串 A 大于字符串 B(在数值上)但字符串 A 比字符串 B 怎么办? PS:我(曾经)是反对者,但用户没有提供足够的细节来证明这个答案本身是不正确的。只是想我会指出这一点
  • @埃文。 . .我的回答清楚地表明它适用于问题中提供的数据,假设只有最后一个字段发生变化。答案有什么你不明白的地方吗?
【解决方案2】:

您可以尝试以下方式:

select
    Name
from TableOne
ORDER BY Cast(Replace(Name, "/", "") as UNSIGNED)

【讨论】:

    【解决方案3】:
    SELECT * FROM myTable 
    ORDER BY CAST(SUBSTRING_INDEX(DATA_COLUMN,"/",-1) AS UNSIGNED) ;
    

    它是如何工作的:

    1:在您的原始 order by 中,该顺序不正确,因为它是按字典顺序比较字符串,而您希望基于整数值进行排序。

    2.. 在此解决方案中,SUBSTRING_INDEX 提取 / 之后的最后一个值,然后将其转换为整数以提供所需的顺序。

    3.. 您可以将相同的解决方案扩展到数据模式中的倒数第二个、倒数第三个数字。

    【讨论】:

      【解决方案4】:

      不是一个漂亮的查询,但它应该可以满足您的需求:

      SELECT s
      FROM
        yourtable
      ORDER BY
        s + 0,
        CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>0
             THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 2), '/', -1)+0
             ELSE 0 END,
        CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>1
             THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 3), '/', -1)+0
             ELSE 0 END,
        CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>2
             THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 4), '/', -1)+0
             ELSE 0 END,
        CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>3
             THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 5), '/', -1)+0
             ELSE 0 END
      

      请看小提琴here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 2014-03-04
        • 1970-01-01
        • 2011-05-17
        • 2013-05-05
        • 1970-01-01
        相关资源
        最近更新 更多