MySQL 按字段和父项排序

标签 mysql sql

所以我有一个包含 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/

相关文章:

mysql - 无法删除索引列,错误 1025 (HY000) : Error on rename of . 。到..(错误号:150)

php - 连接两张表的sql语句

php - 用于搜索的 SQL 查询帮助

mysql - 先复制然后更改mysql中复制数据的ID

php - 将数组值插入数据库

mysql - MySQL 触发器的语法错误

PHP + MsSQL = 复选框问题。需要帮忙!

php - Codeigniter:单击提交按钮后没有记录保存在 mysql 数据库中

java - 从 ResultSet Java 获取主键列

php - mySQL 语句 ORDER BY 多列