MySQL按字段排序&父母

时间:2015-04-15 16:12:27

标签: mysql sql

所以我有一个包含7个项目的桌子。让我们称他们为:汽车,船,房子,自行车,车轮,水槽,床。我们可以简单地调用表格表

每个都有以下分配的号码:

(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

车轮是汽车(或自行车,无所谓)和水槽的孩子。床是House的孩子。父信息存储在名为parent_id的列中。对于没有父母的一切,它都是null。

我需要使用MySQL通过指定的数字顺序对此表进行排序(称为ordinal,此处为我的表中的#),但保留父子订单信息。因此列表应按如下方式排序:

(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执行此操作?我们可以假设所有这些信息都放在一张桌子上。

3 个答案:

答案 0 :(得分:1)

您最好保留parent_id,但不要保留父名称。

以下是订购表格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

答案 1 :(得分:0)

这样的事情应该有用。我假设以下字段id,(#)= order_num和parent_id:

SELECT * FROM table as t
ORDER BY
   CASE
       WHEN parent_id IS NOT NULL THEN (SELECT id FROM table WHERE id = t.parent_id LIMIT 1)
       ELSE id
   END,
   CASE
       WHEN parent_id IS NULL THEN -1
       ELSE order_num
   END;

答案 2 :(得分:0)

假设以下结构:

CREATE TABLE `Table` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`number` INT NOT NULL,
`parent_id` VARCHAR(32) DEFAULT NULL,
PRIMARY KEY(`id`)
);

类似的东西:

SELECT `Table`.* FROM `Table`
LEFT JOIN `Table` dependant ON dependant.`name` = `Table`.`parent_id`
ORDER BY CONCAT(IF(dependant.`name` IS NULL,`Table`.`name`,CONCAT(dependant.`name`,':',`Table`.`name`))) ;

可能会奏效。

注意

  1. 在询问有关RDBMS的问题时,请考虑创建初始表结构和数据SQL。然后会有更多人愿意回答

  2. 阅读此article,了解如何在MySQL中存储层次结构数据。它曾经在.mysql.com上托管,但由于某种原因,他们删除了它。这是一个美妙的arrticle。

  3. 考虑转移到嵌套集