项目中常常会遇到父子结构显示的问题,不同的数据库有不同的写的方式,比方SqlServer中用with union 实现。而Mysql则没有这么方便的语句。
例如以下category表。食品有pizaa,buger,coffee。而pizza又分了加cheese几种,怎样将他们的父子结构表现出来呢?
CREATE TABLE category(
id INT(10),
parent_id INT(10),
name VARCHAR(50)
); INSERT INTO category (id, parent_id, name) VALUES
(1, 0, 'pizza'), --node 1
(2, 0, 'burger'), --node 2
(3, 0, 'coffee'), --node 3
(4, 1, 'piperoni'), --node 1.1
(5, 1, 'cheese'), --node 1.2
(6, 1, 'vegetariana'), --node 1.3
(7, 5, 'extra cheese'); --node 1.2.1
*上一个人给了一个非常好的解决方式:
1. 创建一个函数
delimiter ~
DROP FUNCTION getPriority~ CREATE FUNCTION getPriority (inID INT) RETURNS VARCHAR(255) DETERMINISTIC
begin
DECLARE gParentID INT DEFAULT 0;
DECLARE gPriority VARCHAR(255) DEFAULT '';
SET gPriority = inID;
SELECT parent_id INTO gParentID FROM category WHERE ID = inID;
WHILE gParentID > 0 DO /*0为根*/
SET gPriority = CONCAT(gParentID, '.', gPriority);
SELECT parent_id INTO gParentID FROM category WHERE ID = gParentID;
END WHILE;
RETURN gPriority;
end~ delimiter ;
2. 调用函数得到的便是排完序的结果
SELECT * FROM category ORDER BY getPriority(ID);
☆ getPriority 这个函数的限制条件是:全部数据追溯上去必须有唯一的祖先。从树结构来看。不能有多棵树。
来源:http://*.com/questions/14890204/order-sql-tree-hierarchy