碰到一个困难,暂时不说表结构设计的问题了。
想查询出员工所在的分公司名称。
员工表employee.deptment_id和部门表sys_deptment.`code`是关联的。
SELECT employee.`name` as 姓名,employee.deptment_id as 部门ID,sys_deptment.`name` as 部门名称,sys_deptment.`code` as 部门ID,
FROM employee ,sys_deptment
WHERE employee.deptment_id=sys_deptment.`code`上述这段语句只能查询出所在部门名称,但是我想改造下查询出所在分公司,达到图片所示的效果,请问有高人乐于出手相助吗?谢谢了。sys_deptment部门表是个机构树,3位数开头的是分公司,5位数开头的是部门。例如108是上海分公司,10811是上海分公司的下属部门,10814也是上海分公司的下属部门。MYSQL建表的语句如下。SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `deptment_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`) USING BTREE,
  KEY `name` (`name`),
  KEY `deptmentid` (`deptment_id`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES ('1', '张三', '10814');
INSERT INTO `employee` VALUES ('2', '李四', '10815');
INSERT INTO `employee` VALUES ('3', '王五', '1081903');
INSERT INTO `employee` VALUES ('4', '赵六', '10925');
INSERT INTO `employee` VALUES ('5', '赵七', '10928');SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for sys_deptment
-- ----------------------------
DROP TABLE IF EXISTS `sys_deptment`;
CREATE TABLE `sys_deptment` (
  `id` int(50) NOT NULL,
  `code` varchar(40) DEFAULT NULL,
  `name` varchar(400) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `inx_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of sys_deptment
-- ----------------------------
INSERT INTO `sys_deptment` VALUES ('1', '1', '总公司');
INSERT INTO `sys_deptment` VALUES ('194', '108', '上海分公司');
INSERT INTO `sys_deptment` VALUES ('195', '109', '杭州分公司');
INSERT INTO `sys_deptment` VALUES ('255', '10814', '人力资源部');
INSERT INTO `sys_deptment` VALUES ('256', '10815', '运营部');
INSERT INTO `sys_deptment` VALUES ('257', '10816', '行政部');
INSERT INTO `sys_deptment` VALUES ('258', '10819', '采供部');
INSERT INTO `sys_deptment` VALUES ('259', '10817', '质安部');
INSERT INTO `sys_deptment` VALUES ('260', '10818', '法务部');
INSERT INTO `sys_deptment` VALUES ('261', '1081901', '外协科');
INSERT INTO `sys_deptment` VALUES ('280', '10811', '商务部');
INSERT INTO `sys_deptment` VALUES ('308', '10929', '供应部');
INSERT INTO `sys_deptment` VALUES ('311', '10930', '人力资源部');
INSERT INTO `sys_deptment` VALUES ('312', '10931', '运营部');
INSERT INTO `sys_deptment` VALUES ('337', '10925', '外贸部');
INSERT INTO `sys_deptment` VALUES ('338', '10928', '安全部');
INSERT INTO `sys_deptment` VALUES ('380', '1081903', '计划科');

解决方案 »

  1.   

    有点麻烦  想想有其他SQL写法吗?
      

  2.   

    select b.name 姓名,s.name   from sys_deptment s join (select substring(deptment_id,1,3)  as iid,name from employee) as b on s.code =b.iid  
    这个至少把 分公司查出来了,你再加一下你自己的那些,应该可以吧
      

  3.   

    不知道的你的公司(结构)是几层 ?如果层级比较多,为什么不使用一个专门的字段来标记层级关系 ?如果是这样的递归函数可以很快查询出来。CREATE  
    FUNCTION  getChildLst(deptment_id varchar(300) CHARACTER SET utf8)
      RETURNS varchar(1000) CHARSET utf8
    BEGIN 
       DECLARE sTemp VARCHAR(2000); 
       DECLARE sTempChd VARCHAR(2000); 
     
       SET sTemp = ''; 
       SET sTempChd = concat('',deptment_id); 
     
       WHILE sTempChd is not null DO 
         SET sTemp = concat(sTemp,',',sTempChd); 
          SELECT GROUP_CONCAT(deptment_id)  INTO sTempChd from   sys_deptment  where  locate(sTempChd,deptment_id+'') >0 ; 
       END WHILE; 
       RETURN right(sTemp, length(sTemp)-1); 
     END看看这样行不行,感觉应该需要改进一下(查询的数据可能会有重复)
      

  4.   

    http://blog.csdn.net/acmain_chm/article/details/4142971MySQL中进行树状所有子节点的查询
    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点。但很遗憾,在MySQL的目前版本中还没有对应的功能。 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度是4, 那么所有节点为根的树的深度均不会超过4,则我们可以直接通过left join 来实现。 但很多时候我们...