项目中经常会遇到父子结构显示的问题,不同的数据库有不同的写的方式,比如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. 创建一个函数
MallWWI新模式返利商城系统基于成熟的飞蛙商城系统程序框架,支持多数据库配合,精美的界面模板,人性化的操作体验,完备的订单流程,丰富的促销形式,适合搭建稳定、高效的电子商务平台。创造性的完美整合B2B\B2C\B2S\C2B\C2C\P2C\O2O\M2C\B2F等模式,引领“互联网+”理念,实现商家联盟体系下的线上线下全新整合销售方式,独创最流行的分红权返利与排队返钱卡功能。安全、稳定、结构
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 这个函数的限制条件是:所有数据追溯上去必须有唯一的祖先。从树结构来看,不能有多棵树。









