根据列中的正整数或负整数排序 MySQL Table
Ordering a MySQL Table Based on a Positive or Negative Integer in a Column
我有一个名为 example
的 MySQL table,其中包含列 my_order
和 alt_order
。
这是我要实现的目标:
- 如果
alt_order
为空,按 my_order
排序。
- 如果
alt_order
不为空,则按 my_order
排序,但根据 alt_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)
我有一个名为 example
的 MySQL table,其中包含列 my_order
和 alt_order
。
这是我要实现的目标:
- 如果
alt_order
为空,按my_order
排序。 - 如果
alt_order
不为空,则按my_order
排序,但根据alt_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 thealt_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)