最近公司在做《資管系統》賬號管理部分需要得到所有子賬號、父賬號等等信息。個人覺得用遞歸查詢比較繁瑣,於是設計了以下表
關鍵字段:賬號id,父賬號、頂級賬號、賬號層次(也就是樹的級別)。
查詢思路:查找頂級賬號用層這個字段直接搞定
查找某個賬號的子賬號用該賬號的頂級賬號和層搞定
查找父賬號用該賬號的頂級賬號和層搞定
設計難點:一張表外鍵關聯到自己、添加修改刪除時對數據的有效性有很大的保障
提供源碼(包含查詢方法),需要其他字段自行增加 (勿噴)
表和數據
-- ----------------------------
-- Table structure for `tb_account`
-- ----------------------------
DROP TABLE IF EXISTS `tb_account`;
CREATE TABLE `tb_account` ( `id` int(11) NOT NULL COMMENT '賬號ID', `name` varchar(32) NOT NULL COMMENT '賬號名稱', `password` varchar(64) NOT NULL COMMENT '賬號密碼', `degree` int(11) NOT NULL COMMENT '賬號層次,賬號樹的層次', `parent` int(11) NOT NULL COMMENT '父賬號ID', `master` int(11) NOT NULL COMMENT '頂層賬號ID,即真實賬號', `childs` text COMMENT '子賬號列表,所有的子賬號id(包含子賬號的子賬號),按"|"分割', `inserttime` datetime DEFAULT NULL COMMENT '插入時間', `updatetime` datetime DEFAULT NULL COMMENT '修改時間', `remark` varchar(256) DEFAULT NULL COMMENT '備注', PRIMARY KEY (`id`), KEY `FK_TB_ACCOUNT_REFERENCE_TB_ACCOUNT_P_` (`parent`), KEY `FK_TB_ACCOUNT_REFERENCE_TB_ACCOUNT_M_` (`master`), CONSTRAINT `FK_TB_ACCOUNT_REFERENCE_TB_ACCOUNT_M_` FOREIGN KEY (`master`) REFERENCES `tb_account` (`id`), CONSTRAINT `FK_TB_ACCOUNT_REFERENCE_TB_ACCOUNT_P_` FOREIGN KEY (`parent`) REFERENCES `tb_account` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of tb_account -- ---------------------------- INSERT INTO `tb_account` VALUES ('1', 'acct_1', '1', '1', '1', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('2', 'acct_2', '2', '1', '2', '2', null, null, null, null); INSERT INTO `tb_account` VALUES ('3', 'acct_3', '3', '2', '1', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('4', 'acct_4', '4', '2', '1', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('5', 'acct_5', '5', '3', '3', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('6', 'acct_6', '6', '3', '3', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('7', 'acct_7', '7', '4', '5', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('8', 'acct_8', '8', '4', '6', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('9', 'acct_9', '9', '4', '6', '1', null, null, null, null); INSERT INTO `tb_account` VALUES ('10', 'acct_10', '10', '2', '2', '2', null, null, null, null); INSERT INTO `tb_account` VALUES ('11', 'acct_11', '11', '2', '2', '2', null, null, null, null); INSERT INTO `tb_account` VALUES ('12', 'acct_12', '12', '3', '11', '2', null, null, null, null); INSERT INTO `tb_account` VALUES ('13', 'acct_13', '13', '3', '11', '2', null, null, null, null);
查詢操作
-- 查找所有的頂級賬號 -- SELECT id,name,degree,parent,`master` FROM tb_account WHERE degree = 1 -- 查找頂級賬號的所有子賬號(包括子賬號的子賬號) -- SELECT * FROM tb_account WHERE `master` = 1 -- 查找子賬號的父賬號,根據子賬號的parent直接找 -- SELECT * FROM tb_account WHERE id = 1 -- (parent) -- 查找子賬號的所有子賬號(包括子賬號的子賬號) -- 賬號id、層次 -- SELECT a.id,a.name,a.degree,a.parent,a.`master` -- FROM tb_account a,tb_account b -- WHERE b.id = 1 and a.`master` = b.`master` AND a.degree > b.degree -- 查找當前賬號的直接子賬號 -- SELECT * FROM tb_account where parent = 1 -- (當前賬號id)