你可以这样排序:
SELECT *
from my_table
ORDER BY IF(`id_attached` is NULL, id, `id_attached`),id;
第二个问题:
SELECT * from my_table ORDER BY IF(`id_attached` = 0, id, `id_attached`),id;
结果现在与您的问题相同。是不是对的再问我一次,对不起
示例
mysql> select * from my_table;
+------+-------------+---------------+
| id | id_attached | name |
+------+-------------+---------------+
| 1 | NULL | Name of row 1 |
| 2 | NULL | Name of row 2 |
| 3 | 1 | Name of row 3 |
| 4 | 1 | Name of row 4 |
+------+-------------+---------------+
4 rows in set (0,00 sec)
mysql>
mysql>
mysql> SELECT * from my_table
-> ORDER BY IF(`id_attached` is NULL, id, `id_attached`),id;
+------+-------------+---------------+
| id | id_attached | name |
+------+-------------+---------------+
| 1 | NULL | Name of row 1 |
| 3 | 1 | Name of row 3 |
| 4 | 1 | Name of row 4 |
| 2 | NULL | Name of row 2 |
+------+-------------+---------------+
4 rows in set (0,00 sec)
mysql>
带子顺序的示例
SELECT * from my_table m ORDER BY IF(id_attached = 0, id, id_attached+0.1),id;
带有新字段的示例
这将自动更新新字段。仅当 ID 不是 AUTO_INC 时才有效
ALTER TABLE my_table
add COLUMN myorder INT GENERATED ALWAYS
AS (
IF(`id_attached` = 0, id<<1, (`id_attached`<<1) +1)
) STORED
;
ALTER TABLE my_table ADD INDEX idx_myorder (myorder);
结果
mysql> select * from my_table;
+----+-------------+----------------+---------+
| id | id_attached | name | myorder |
+----+-------------+----------------+---------+
| 15 | 20 | Name of row 5 | 41 |
| 20 | 0 | Name of row 1 | 40 |
| 21 | 0 | Name of row 2 | 42 |
| 22 | 20 | Name of row 3 | 41 |
| 23 | 20 | Name of row 4 | 41 |
+----+-------------+----------------+---------+
5 rows in set (0,00 sec)
mysql>