mysql 父子结构排序
项目中经常会遇到父子结构显示的问题,不同的数据库有不同的写的方式,比如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
stackoverflow上一个人给了一个很好的解决方法:
1. 创建一个函数
delimiter ~drop function getpriority~create function getpriority (inid int) returns varchar(255) deterministicbegin 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://stackoverflow.com/questions/14890204/order-sql-tree-hierarchy