0

首先,抱歉标题毫无意义。想不出更好的了。请看一下我的下表:

用户

+-----+-------+---------------+
|  id | name  | email         |
+-----+-------+---------------+
|   1 | NameA | namea@srv.com |
|   2 | NameB | nameb@srv.com |
|   3 | NameC | namec@srv.com |
+-----+-------+---------------+

部门

+-----+---------+-------+---------+
|  id | company | name  | manager |
+-----+---------+-------+---------+
|   1 |       1 | DeptA |       1 |
|   2 |       1 | DeptB |       2 |
+-----+---------+-------+---------+

公司

+-----+------+-------+
|  id | name | owner |
+-----+------+-------+
|   1 | Buzz |     3 |
+-----+-------+------+

我需要找到与公司相关的所有用户。就像是:

+---------+------------+
| user_id | company_id |
+---------+------------+
|       1 |          1 |
|       2 |          1 |
|       3 |          1 |
+---------+------------+

我怎样才能做到这一点?我读到了不同类型的连接(内部、外部、完整等),但我不知道如何处理所有中间的“部门”表。

4

3 回答 3

3

我会用两个查询来做到这一点:

select Department.manager as user_id, Company.id
from Company
join Department on Department.company=Company.id

union

select Company.owner as user_id, Company.id
from Company
于 2013-03-26T19:27:55.053 回答
0
select User.id, User.name, User.email, CASE WHEN User.id = Company.Owner THEN 'YES' ELSE 'NO' END as CompanyOwner
from User
inner join Department on User.DepartmentID = Department.id
inner join Company on Company.id = Department.company

我认为您缺少用户和部门之间的实体关系,可能是用户表上的部门 ID。我认为这可能是您缺少的部分。

于 2013-03-26T21:03:42.777 回答
0

通常,您可以通过某种方式将用户链接到他们工作的部门。将 DeptID 列添加到用户表中。在这个例子中,所有者的部门被表示为空,而经理的部门被填充,但是你这样做的方式取决于你。

 User
+-----+-------+---------------+------+
|  id | name  | email         | dept |
+-----+-------+---------------+------+
|   1 | NameA | namea@srv.com |    1 |
|   2 | NameB | nameb@srv.com |    2 |
|   3 | NameC | namec@srv.com |  +++ |   
|   4 | NameD | named@srv.com |    2 |
|   5 | NameE | namee@srv.com |    2 |
+-----+-------+---------------+------+ 

因此,要获取在 User 表上填充部门的所有公司 1 用户的列表,这变得很简单

SELECT u.id       as user_id,
       d.company  as company_id
  FROM User u
  INNER JOIN Department d   ON u.dept=d.id
  WHERE d.company=1

UNION

SELECT owner  as user_id,
       id     as company_id
  FROM Company

如果您选择不在 User 表中填充经理的部门,则还必须为该部分附加一个 UNION,其结构类似于上面的第一部分。

或者,您可能有一个关联表来显示哪些员工为哪个部门工作。如果一个人可以在多个部门工作,则可能需要这样做。(经理和所有者可能不需要在此表中,因为它们已经被考虑在内。再次,由您决定。但是如果您确实包括它们,那么您将不需要 UNION,因此它会使事情变得更简单。您可能甚至将所有者置于“所有权”部门。)

 UserDept
+--------+--------+
| UserID | DeptID |
+--------+--------+
|    4   |    2   |
|    5   |    2   |
+--------+--------+

SELECT u.id       as user_id,
       d.company  as company_id
  FROM UserDept u
  INNER JOIN Department d   ON u.dept=d.id
  WHERE d.company=1

(如果您没有在 UserDept 表中包含所有者/经理,则根据需要添加 UNION。)

但如果您需要更深入的示例,假设您还需要 User 表中的名称:

SELECT u.id       as user_id,
       d.company  as company_id,
       u.name     as user_name
  FROM User u
  INNER JOIN UserDept x     ON u.id=x.user
  INNER JOIN Department d   ON x.dept=d.id
  WHERE d.company=1
于 2013-03-26T22:47:02.997 回答