所以我有一个包含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执行此操作?我们可以假设所有这些信息都放在一张桌子上。
答案 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`))) ;
可能会奏效。
注意
在询问有关RDBMS的问题时,请考虑创建初始表结构和数据SQL。然后会有更多人愿意回答
阅读此article,了解如何在MySQL中存储层次结构数据。它曾经在.mysql.com上托管,但由于某种原因,他们删除了它。这是一个美妙的arrticle。