JOIN声明或不同的方法

时间:2016-12-23 20:39:12

标签: mysql

我只在表格中包含了与此相关的列,所以请查看用户和地址表中列的缺失。

快速了解系统。 “经销商”是这里的主要关系,它们位于角色树的顶部。为了创建管理器,您需要将它们绑定到分发服务器,因此需要将它们绑定到DistributorManagerRelationship表。创建代表时,必须将它们绑定到经理,并且该经理只能是与所选分销商关联的经理。因此,在下表中,Live Labs是唯一可以创建代表的分销商,因为该帐户下有经理。

地址表

addressId  firstName  lastName  companyName
  82         Mary       Mertens  IRON Co.
  83         John       Smith    Live Labs
  84         Lauren     Cole      NULL
  85         Sam        Little    NULL
  86         Wayne      Brady     NULL
  87         Ronald     Foster    NULL
  88         Shawn      Wood      NULL

用户表

userId  active  username     role          addressId
  19       1     mary     distributor         82
  20       1     john     distributor         83
  21       1     lauren   manager             84
  22       1     sam      manager             85
  23       1     wayne    manager             86
  24       1     ronald   representative      87
  25       1     shawn    representative      88

DistributorManagerRelationship

distributorId  managerId
    20            21
    20            22
    20            23

ManagerRepRelationship

repId  managerId
  24       21
  24       22
  25       22

这是我遇到的问题。当分销商登录并查看他下面的所有用户(他的经理和代表)时,我所拥有的SQL语句只会抓住在ManagerRepRelationship表中具有关系的代表和经理。所以举个例子。

SELECT DISTINCT Users.userId, Users.role, Users.username, Address.firstName, Address.lastName
FROM Users 
JOIN Address 
 ON Users.addressId=Address.addressId 
JOIN ManagerRepRelationship 
 ON Users.userId=ManagerRepRelationship.repId 
 OR Users.userId=ManagerRepRelationship.managerId 
JOIN DistributorManagerRelationship 
 ON Users.userId=DistributorManagerRelationship.managerId 
 OR ManagerRepRelationship.managerId=DistributorManagerRelationship.managerId 
WHERE DistributorManagerRelationship.distributorId=20 AND Users.userId!=20 ORDER BY Address.lastName

上述SQL语句将返回与Live Labs EXCEPT userId 23(Wayne Brady)相关联的所有代表和经理。我理解为什么会这样,因为Wayne与JOIN的参数不匹配,因为他缺乏代表性。我一直在与这个SQL语句作斗争几个小时,我似乎无法做到正确。我想要的结果是所有管理人员和销售代表都与Live Labs相关联,即使ManagerRepRelationship表中没有关系也是如此。也许我需要结合两个不同的JOIN查询?我被卡住了。

我希望我能很好地解释这个问题,如果我没有说清楚的话,请发表评论。

1 个答案:

答案 0 :(得分:1)

如果您想要包含没有代表的人,那么您希望允许null代表值,而不是

JOIN ManagerRepRelationship

你需要

LEFT JOIN ManagerRepRelationship