我需要什么样的JOIN或WHERE子句?

时间:2013-11-25 13:25:56

标签: mysql sql join where-clause

我一直试图争抢一个查询以获取3个表的列,但我一直得到不匹配的行。

这些是我的表格:

消息
  - messageID
  - 发件人(可以是customerID或employeeID)   - 接收者(可以是customerID或employeeID)

(注意:对于每封邮件,它只包含1位客户和1位员工,即客户不会互相交流,员工也不会互相发送信息)

客户
  - customerID

员工
  - employeeID
  - departmentID

DEPARTMENT
  - departentID
  - departmentName

对于customerID = 5的特定客户,我想知道他们正在与之交谈的员工的DepartmentName是什么。

我在这方面的尝试是:

SELECT * FROM Messages,Employee, Departmnet, 
WHERE sender = '5' OR receiver = '5' 
AND (Employee.employeeID = Messages.sender OR Employee.employeeID = Messages.Receiver) 
AND Employee.departmentID = Department.DepartmentID;

然而,这会返回比预期更多的行。我认为这是因为发件人或收件人可能是employeeID。

我的第二个猜测是也许我必须加入牌桌,但我没有太多经验。如果有人可以告诉我或告诉我如何执行此查询,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

根本问题是你在这个条款中缺少括号:

sender = '5' OR receiver = '5' 

但是,我建议您使用ANSI样式的连接来使查询更具可读性。

这应该有所帮助:

SELECT * 
FROM Messages
INNER JOIN Employee ON (Employee.employeeID = Messages.sender OR Employee.employeeID = Messages.Receiver)
INNER JOIN Department ON Employee.departmentID = Department.DepartmentID
WHERE (Messages.sender = '5' OR Messages.receiver = '5');

答案 1 :(得分:1)

你试过这个:

SELECT * FROM Messages m 
INNER JOIN Employee e 
INNER JOIN Departmnet d 
ON ((m.sender=e.employeeId || m.receiver=e.employeeId) d.departmentId=e.departmentId) 
WHERE m.sender = '5' OR m.receiver = '5'

答案 2 :(得分:0)

您的问题实际上是Employee与[{1}}具有相同的ID,无法区分两者。

我认为更好的方法是将CustomerCustomers都视为Employees,并将Users表格与User相关联}表,告诉您他们是客户还是员工。

另一种方法是让Message表具有EmployeeID的一个字段和CustomerID的一个字段,以及一个字段,用于指定这是客户到员工还是员工到客户。换句话说,发送的消息或收到的消息。

最后,如果您确定不会与客户和员工ID发生冲突,那么这可能会对您的查询产生影响:

Role

以上规定接收方和发送方不能同时是员工或客户。

更新:为了澄清,单个字段不应引用另外两个表,因为这样就无法将其指定为外键。两个表的标识列中可能存在冲突。例如,如果您的客户ID为5,员工ID为5,会发生什么?

有处理这种情况的技巧,其中一些显示在这里:Foreign Key to multiple tables