【问题标题】:Why mysql order by alphanumeric not working为什么按字母数字排序的mysql不起作用
【发布时间】:2021-01-31 18:16:55
【问题描述】:

我遇到了 MySQL 查询的问题。问题是 我有一个名为“成员”的表和一个“区域”列。在“区域”列中有字母数字值,如

1
2
Street # 2
5
78
Street # 1A
Street # 1
Street # 1C
Street # 1B
3

 

现在我想要什么?我想这样排序

1
2
3
5
78
Street # 1
Street # 1A
Street # 1B
Street # 1C
Street # 2

我几乎尝试了所有代码,但没有满足我的要求。最后一个代码很好,但不符合我的要求。目前,我有这个代码:

SELECT DISTINCT(area) FROM members ORDER BY LENGTH(area), area ASC

我要清除的一件事是该区域字段中有重复值。

如果有人帮助我,我将不胜感激。

提前致谢

【问题讨论】:

    标签: mysql sql string sql-order-by


    【解决方案1】:

    这应该适用于您的示例数据:

    SELECT DISTINCT area 
    FROM members 
    ORDER BY (area + 0 > 0 or area = '0') desc, area + 0, area
    

    Demo on DB Fiddle

    |面积 | | :------------ | | 1 | | 2 | | 3 | | 5 | | 78 | |街道#1 | |街道#1A | |街道#1B | |街道#1C | |街道#2 |

    【讨论】:

    • 当然它在 DB Fiddle 上工作,但在我的系统上没有。
    • @MuhammadFaryad:定义不起作用。你有错误吗?错误的结果(如果是,什么它们有问题)?
    • 我得到了结果,没有错误但不符合预期。街道#1 街道#10 街道#11 街道#11A 街道#11B 甚至还有街道#1A 街道#1B 街道#1C
    【解决方案2】:

    如果是数字,则提取字符串的第一部分并排序:

    select t.*
    from t
    order by (area regexp '^[0-9]') desc,        -- numbers first
             substring_index(area, ' ', 1) + 0,  -- by number
             area asc                            -- rest alphabetically
    

    请注意,这会处理初始数字以0 开头的尴尬情况。

    根据您希望字符串的排序方式,您可能仍希望以 len(area), area 作为最后两个 order by 键结束。

    Here 是一个 dbfiddle。

    【讨论】:

    • 它在 Db Fiddle 网站上运行,但在我的系统上不运行。
    • @MuhammadFaryad 。 . .它怎么不工作? db fiddle 可以显示代码有效。
    • 我说过代码在 db fiddle 上运行,但在我的系统上运行不正常。我很迷惑。我不知道为什么它在我的系统上不起作用。可能是Mysql版本的原因
    • @MuhammadFaryad 。 . .这是非常标准的 MySQL,并且几乎一直受到支持。
    • 我挣扎了 6 到 8 个小时,尽我所能,但没有得到我想要的结果。
    【解决方案3】:

    还有一个查询:

    SELECT DISTINCT(area)
    FROM members 
    ORDER BY 
        area+0=0 ASC, -- get numbers first
        area+0 ASC, -- order numbers
        area ASC; -- order strings
    

    现场小提琴SQLize.online

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多