2013-03-26 36 views
0

首先,对于无意义的标题感到抱歉。想不到更好的。请看看我下面的表格:选择与公司有关的所有用户

用户

+-----+-------+---------------+ 
| id | name | email   | 
+-----+-------+---------------+ 
| 1 | NameA | [email protected] | 
| 2 | NameB | [email protected] | 
| 3 | NameC | [email protected] | 
+-----+-------+---------------+ 

+-----+---------+-------+---------+ 
| 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 | 
+---------+------------+ 

我该怎么做?我读了关于不同类型的连接(内部,外部,全部等),但我无法弄清楚如何在一切中间处理该“部门”表。

+0

在所示的示例数据中,看起来只显示了部门经理或公司所有者,并且都在用户表中。没有针对部门(非经理)成员的用户显示的信息。这是你的意图吗? – WarrenT 2013-03-26 20:06:43

回答

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 
+0

谢谢您的及时答复,Blorgbeard,但您的建议与我所尝试的非常相似。问题是第三个结果(在这个例子中)没有出现。如果他也是公司的所有者,我需要找到用户。 – tavlima 2013-03-26 19:40:58

+0

@tavlima啊我看到了 - 我编辑了我的答案。那样有用吗? – Blorgbeard 2013-03-26 19:43:42

+0

它的工作原理,@Blorgbeard。谢谢。 – tavlima 2013-03-26 19:57:56

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 

我想你错过了在用户表用户和部门,也许是DepartmentID的之间的关系entitiy。我认为这可能是你错过的部分。

+0

所有的关系都在那里。只是不容易“选择”,可以这么说。无论如何,谢谢你的建议。也许我会重新考虑我的模型。 – tavlima 2013-04-05 05:49:41

0

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

User 
+-----+-------+---------------+------+ 
| id | name | email   | dept | 
+-----+-------+---------------+------+ 
| 1 | NameA | [email protected] | 1 | 
| 2 | NameB | [email protected] | 2 | 
| 3 | NameC | [email protected] | +++ | 
| 4 | NameD | [email protected] | 2 | 
| 5 | NameE | [email protected] | 2 | 
+-----+-------+---------------+------+ 

因此,要获得所在部门被填充在用户表中的所有公司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 

如果选择不填充经理部门的用户表,你必须为该部分添加一个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表。)

,但如果你需要一个更深层的例子,假设您还需要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 
+0

正如我在@discGolfJay的回答中所评论的那样,我开始考虑重塑我的实体。这个问题的首要原因是我想先创建用户,而不是将它们绑定到任何部门或公司。也许是时候改进这个模型,并从第0天开始建立这种关系。不管怎么说,还是要谢谢你。 – tavlima 2013-04-05 05:52:16

+0

从最适合您的应用的模型开始始终是一个好主意。 ;-) – WarrenT 2013-04-06 01:46:14