根据列中的正整数或负整数排序 MySQL Table

Ordering a MySQL Table Based on a Positive or Negative Integer in a Column

我有一个名为 exampleMySQL table,其中包含列 my_orderalt_order

这是我要实现的目标:

伪代码:

SELECT
  *
FROM
  example
ORDER BY
  IF(alt_order IS NULL, my_order, [MOVE UP OR DOWN BASED ON alt_order])

理想输出:

+--------+----------+-----------+-------------------------------------+
| desc   | my_order | alt_order | notes                               |
+--------+----------+-----------+-------------------------------------+
| Item 1 | 1        | NULL      | Ordered by my_order                 |
| Item 3 | 122      | -1        | Ordered by my_order + alt_order     | <-- Move up one row
| Item 2 | 50       | NULL      | Ordered by my_order                 |
| Item 4 | 127      | NULL      | Ordered by my_order                 |
| Item 5 | 205      | NULL      | Ordered by my_order                 |
+--------+----------+-----------+-------------------------------------+

尝试:

SELECT
  *
FROM
  example
ORDER BY
  IF(alt_order IS NULL, my_order, my_order + alt_order)

# The problem with using this method is that the value of my_order
# has to be the same as the value of above it to work.

Edit:

If the alt_order is positive n, then it should move down n rows. On the other hand, if the alt_order is negative n, then it should move up n rows.

看起来你指定的结果可以通过对行进行两次排序来实现。首先,按 my_order 排序,并分配一个初始 "row number"。然后,进行第二次遍历,按 "row offset" 调整的初始 "row number" 排序。因为 "row number" 和 "row offset" 都是整数,所以当我们将它们相加时 (rn=2 + ro=0) 我们可以得到一个碰撞 (rn=3 ro=-1)。为了使排序更加确定,我们需要调整

 SELECT s.desc
      , s.my_order
      , s.alt_order
      , s.notes
   FROM ( SELECT @rn := @rn + 1 AS rn
               , t.desc
               , t.my_order
               , t.alt_order
               , t.notes
            FROM `example` t
           CROSS
            JOIN ( SELECT @rn := 0 ) i   
           ORDER BY t.my_order
        ) s
  ORDER
     BY s.rn + IFNULL(s.alt_order,0.5)

下面的查询可能对您有用或向您发送正确的方向。通过在 ORDER BY 中使用 CASE 语句,您可以控制数据排序的方式。

SELECT * FROM `example`
ORDER BY 
(CASE WHEN `alt_order` IS NULL THEN `my_order` ELSE (`my_order` + `alt_order`) END)