从同一个表中连接结果

时间:2015-12-04 12:01:49

标签: mysql sql

我无法找到解决问题的方法:

我有一个表名为员工的员工,他们的名字和他们报告的身份证。

Employees:
id   name  reports_to
2    name2    55
3    name3     2
4    name4     3
5    name5     3
6    name6     2
7    name7    33
8    name8    55

现在我需要能够选择向身份报告55报告的人以及向此人报告的所有人(id2)。但只是降低了一级。

结果如下:

2    name2    55
3    name3     2
6    name6     2
8    name8    55

我尝试了连接和子查询但没有成功。

编辑: 如果可能,结果应该以我的结果表看起来的方式排序: - 向身份证明55报告的人(即#2) - 向#2报告的人应立即跟进

3 个答案:

答案 0 :(得分:1)

这是一种方法,使用子查询来获得第二级:

select e.*
from employees e
where e.reports_to = 55 or
      e.reports_to in (select e2.id from employees e2 where e2.reports_to = 55);

编辑:

要进行此排序,需要使用join而不是in。我认为逻辑看起来像这样:

select e.*
from employees e left join
     employees e2
     on e.reports_to = e2.id
where 55 in (e.reports_to, e2.reports_to)
order by coalesce(e2.id, e.id), (e2.id is null) desc

答案 1 :(得分:0)

或者,如果子查询不是你真正的东西......

SELECT y.* 
  FROM employees x 
  JOIN employees y 
    ON x.id IN(y.reports_to,y.id) 
 WHERE x.reports_to = 55;
+----+-------+------------+
| id | name  | reports_to |
+----+-------+------------+
|  2 | name2 |         55 |
|  3 | name3 |          2 |
|  6 | name6 |          2 |
|  8 | name8 |         55 |
+----+-------+------------+

顺便说一下,如果有人知道为什么上面的查询格式化结果集的方式与下面的查询略有不同,我会感兴趣...

SELECT y.* 
  FROM employees x 
  LEFT 
  JOIN employees y 
    ON x.id IN(y.reports_to,y.id) 
 WHERE x.reports_to = 55;
+------+-------+------------+
| id   | name  | reports_to |
+------+-------+------------+
|    2 | name2 |         55 |
|    3 | name3 |          2 |
|    6 | name6 |          2 |
|    8 | name8 |         55 |
+------+-------+------------+
    ^^

很奇怪,嗯?

答案 2 :(得分:0)

您有一个使用邻接列表模型建模的层次结构。该模型的优点在于它对建模者来说非常直观,并且便于用户进行更新。但是,正如您所发现的那样,缺点是查询并不容易,因为您需要为层次结构中的每个级别创建一个新的连接(或等效连接)。当级别数是任意的时,这尤其棘手。

对于mysql解决方案,请参阅adjacency list vs nested set