根据表中的其他字段选择特定字段

时间:2012-06-02 14:51:57

标签: mysql sql sql-server

我使用了三张桌子,这证明了这个问题远远超出了我的联盟。

第一个是层次结构表,看起来像这样

USER_ID, USER_LEVEL, Store_Manager_ID, Team_Manager_ID
------------------------------------------------------
1, 0, -, -
2, 1, 1, -
3, 2, 1, 2
4, 2, 1, 2
5, 2, 1, 2

这只是显示用户的层次结构。因此,用户1的等级为0,这意味着他是商店经理,因此他没有商店经理,所以他的商店经理ID没什么,团队经理显然没什么。 第二个用户是团队经理,所以level = 1,商店经理是1(第一个人) 第三,第四和第五名分别是1岁和2岁以下的工人。

第二个是登录表,如下所示

USER_ID, EMAIL
--------------------------
1, john.smith@gmail.com
2, ron.jones@gmail.com
3, tom.graham@gmail.com
4, bill.small@gmail.com

电子邮件是登录名,没有密码。

第三个是别名表,看起来像这样

USER_ID, ALIAS_ID
--------------------
2, 5

别名表显示用户5如何是用户2的别名。因此,他是同一个人,并具有相同的登录名。但是,他可以同时出现在两个位置,即同时担任团队经理和工人。

我的问题是。 如果我知道用户2将作为他的别名登录,即登录前的工作人员。 当用户2登录时,如何根据级别选择用户帐户的领导者的ID。

例如,如果我在别名帐户下以ron.jones@gmail.com(用户2)登录。 用户2的别名id是5,并且基于层次结构的用户5是级别2,即工人,因此我应该返回他的团队经理的id而不是他的商店经理。 所以我会返回2,即他自己(在这种情况下有点离奇,但除此之外)

3 个答案:

答案 0 :(得分:1)

这将给出您正在寻找的答案(如果我理解正确的话):

SELECT team_manager_id
FROM   hierarchy h
INNER JOIN aliases a ON h.user_id = a.alias_id 
INNER JOIN login l ON a.user_id = l.user_id
WHERE  email = 'ron.jones@gmail.com';

答案 1 :(得分:0)

Select user_ID, User_level, Store_Manager_ID, Team_Manager_ID 
FROM Hierachy H 
INNER JOIN Alias A on A.Alias_ID = H.User_Id
Where A.User_ID = 2

假设:1用户没有多于1个别名,如果是,您将为同一个用户返回多个记录。

假设你并不关心在hierachy中的记录2,因为你所追求的只是5。

答案 2 :(得分:0)

如果我理解正确,您需要用户的管理员,要么基于用户,要么基于用户的别名。

以下查询执行两个连接,一个连接到用户表,另一个连接到别名表:

SELECT team_manager_id
FROM h.user_id = a.alias_id INNER JOIN
     login l
     ON a.user_id = l.user_id join
     hierarchy huser
     on huser.user_id = a.alias_id join
     hierarchy halias
     on halias.user_id = l.user_id
WHERE l.email = 'ron.jones@gmail.com' and
      huser.team_manager_id is not null and
      halias.team_manager_id is not null

它还会检查管理器是否为空,仅返回别名上的管理器。这将返回所有此类经理。你需要一个特定的,从层次结构的最低层开始吗?