【问题标题】:How to fix ORDER BY with item ids?如何使用项目 ID 修复 ORDER BY?
【发布时间】:2019-06-12 16:01:06
【问题描述】:

我有一个包含项目 ID 的表格 一些例子是:

1
1:3
2:1
2:2
3
3:1
12:2
21:2

我希望它们按列出的方式排序 ^ MYSQL 按以下顺序对它们进行排序:

1
1:3
12:2
2:1
2:2
21:2
3
3:1

有人知道如何解决这个问题吗?

【问题讨论】:

  • 有没有像1:2:3这样的id的情况?
  • 不,只有 X 和 X:Y 的情况。
  • 我希望它们主要按 X 排序,次要按 Y。
  • offtopic:您最好将此信息存储在分开的 x 和 y 列中,而不是基于 varchar 的列中。
  • 终于,理性的声音了。

标签: mysql sql-order-by


【解决方案1】:

使用SUBSTRING_INDEX() 是可能的:

SELECT *
FROM TestTable
ORDER BY CAST(SUBSTRING_INDEX(ColumnVal, ':', 1) AS UNSIGNED),
         CAST(SUBSTRING_INDEX(ColumnVal, ':', 2) AS UNSIGNED)

Demo on db<>fiddle

以另一种方式使用POSITION()

SELECT *
FROM TestTable
ORDER BY CAST(SUBSTRING_INDEX(ColumnVal, ':', 2) AS UNSIGNED),
         POSITION(":" IN ColumnVal),
         SUBSTRING(ColumnVal, POSITION(":" IN ColumnVal) + 1, LENGTH(ColumnVal))

Demo on db<>fiddle

【讨论】:

  • OP 想要 12 个接近尾声
  • 以下将 12:1 放在 101 之前:z
  • 变暖:dbfiddle.uk/…
  • 工作正常,请在这里代表那个人
  • @Szymek。在这种情况下,您的规范是错误的。此结果与请求的结果不同:(dbfiddle.uk/…)
【解决方案2】:
SELECT _table.*
#      , RPAD(SUBSTRING_INDEX(_table._col, ':', 1), 3, 0)
FROM
    (
     SELECT
         CAST('1' AS CHAR) AS _col
     UNION
     SELECT
         '1:3'
     UNION
     SELECT
         '2:1'
     UNION
     SELECT
         '2:2'
     UNION
     SELECT
         '3'
     UNION
     SELECT
         '3:1'
     UNION
     SELECT
         '12:2'
     UNION
     SELECT
         '21:2') _table
ORDER BY RPAD(SUBSTRING_INDEX(_table._col, ':', 1), 3, 0),
    RPAD(SUBSTRING_INDEX(_table._col, ':', 2), 5, 0)
;

【讨论】:

    【解决方案3】:

    如果您满足以下条件,您可以使用ABS()CAST()

    SELECT * FROM table ORDER BY ABS(column);
    SELECT * FROM table ORDER BY CAST(column as DECIMAL);
    

    【讨论】:

    • 这两种方法都会导致 INT 请参阅demo
    • @RaymondNijland 这可能是一种解决方法。你的解决方案是什么?请与我们分享。
    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多