所以我有一个包含 7 个项目的表。我们称它们为:汽车、船、房屋、自行车、车轮、水槽、床。我们可以简单地将表称为Table
每个都分配有以下编号:
(ID) (Item) (#) (parent_id)
1234 - Car - 1 - null
0000 - Boat - 2 - null
2222 - House - 4 - null
6545 - Bike - 5 - null
6547 - Wheels - 0 - 1234
4442 - Bed - 1 - 2222
1474 - Sink - 0 - 2222
车轮是汽车(或自行车,没关系)的子级,水槽和床是房子的子级。父信息存储在称为parent_id 的列中。对于没有父级的所有内容,它都是 null。
我需要使用 MySQL 通过分配的数字顺序(称为序数,这里的表中的 #)对该表进行排序,但保留父子顺序信息。因此列表应按如下方式排序:
(ID) (Item) (#) (parent_id)
1234 - Car - 1 - null
6547 - Wheels - 0 - 1234
0000 - Boat - 2 - null
2222 - House - 4 - null
1474 - Sink - 0 - 2222
4442 - Bed - 1 - 2222
6545 - Bike - 5 - null
如何使用 mysql 做到这一点?我们可以假设所有这些信息都在一张表上。
最佳答案
您最好保留 parent_id
,但不要保留父名称。
这是订购餐 table 的快速解决方案 http://sqlfiddle.com/#!9/2a1fb/3
SELECT *
FROM table1
ORDER BY
CASE WHEN parent_id IS NULL THEN CAST(ID AS CHAR)
ELSE CONCAT(CAST(parent_id AS CHAR),'-', CAST(ID AS CHAR)) END
编辑 1 变体 #2 :-) http://sqlfiddle.com/#!9/76dcb/23
SELECT t1.*
FROM table1 t1
LEFT JOIN table1 t2
ON t2.ID = t1.parent_id
ORDER BY
CASE WHEN t2.ord_idx IS NULL THEN CAST(t1.ord_idx AS CHAR)
ELSE CONCAT(CAST(t2.ord_idx AS CHAR),'-',CAST(t1.ord_idx AS CHAR)) END
编辑 2 要查看此订单的工作原理,您只需添加此字段来选择部分,例如:
SELECT t1.*, CASE WHEN t2.ord_idx IS NULL THEN CAST(t1.ord_idx AS CHAR)
ELSE CONCAT(CAST(t2.ord_idx AS CHAR),'-',CAST(t1.ord_idx AS CHAR)) END as my_order
FROM table1 t1
LEFT JOIN table1 t2
ON t2.ID = t1.parent_id
ORDER BY
CASE WHEN t2.ord_idx IS NULL THEN CAST(t1.ord_idx AS CHAR)
ELSE CONCAT(CAST(t2.ord_idx AS CHAR),'-',CAST(t1.ord_idx AS CHAR)) END
关于MySQL 按字段和父项排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29655419/