2014-05-08 96 views
0

这是三个表我:
电子邮件MySQL的棘手三重加入

 
    +----------+--------------+------+-----+---------+----------------+ 
    | Field | Type   | Null | Key | Default | Extra   | 
    +----------+--------------+------+-----+---------+----------------+ 
    | emailID | int(11)  | NO | PRI | NULL | auto_increment | 
    | subject | varchar(100) | YES |  | NULL |    | 
    | body  | text   | YES |  | NULL |    | 
    | userID | int(11)  | NO |  | NULL |    | 
    | date  | timestamp | YES |  | NULL |    | 
    +----------+--------------+------+-----+---------+----------------+ 

 
    +----------+-------------+------+-----+---------+----------------+ 
    | Field | Type  | Null | Key | Default | Extra   | 
    +----------+-------------+------+-----+---------+----------------+ 
    | userID | int(11)  | NO | PRI | NULL | auto_increment | 
    | name  | varchar(50) | YES |  | NULL |    | 
    | email | varchar(50) | NO |  | NULL |    | 
    | relation | varchar(50) | YES |  | NULL |    | 
    +----------+-------------+------+-----+---------+----------------+ 

toLine

 
    +---------+---------+------+-----+---------+-------+ 
    | Field | Type | Null | Key | Default | Extra | 
    +---------+---------+------+-----+---------+-------+ 
    | emailID | int(11) | NO | PRI | NULL |  | 
    | userID | int(11) | NO | PRI | NULL |  | 
    +---------+---------+------+-----+---------+-------+ 

字段emails.userID是发件人的ID,所以电子邮件来自谁。

我需要的是一个查询,它可以让我通过我发送的电子邮件(关系='研究员')到我的课程主管(关系='课程主任')。我不知道如何做连接,所以我可以用两种不同的方式使用关系字段。

我试着查询:

SELECT count(emails.emailID) 
FROM emails 
LEFT JOIN people ON emails.userID = people.userID 
WHERE people.relation='researcher'; 

这让我所有我发来的电子邮件,但我无法找出如何进一步根据谁的电子邮件被发送到过滤下来。

+1

如果您可以发布一些示例数据并尝试到目前为止会更好.. –

回答

1

请尝试此查询:

select distict e.* from emails e 
join `toLine` t on t.`emailID` = e.`emailID` 
join people pto on pto.`userID` = t.`userID` 
join people pfrom on e.`userID` = pfrom.`userID` 
where pfrom.relation = 'researcher' and pto.relation = 'course director' 
+0

在此示例中可以通过使用DISTINCT来避免重复项。 –

+0

非常感谢! – Jhsu

+0

对不起,我不得不这样做,完成! – Jhsu

0

如果你想通过一个研究员发送到课程主任的所有电子邮件,试试这个...

SELECT e.* FROM emails e 
INNER JOIN people senders 
    ON e.userID = senders.userID 
WHERE senders.relation = 'researcher' 
AND EXISTS (
    SELECT 1 FROM toLine t 
    INNER JOIN people recipients 
     ON t.userID = recipients.userID 
    WHERE e.emailID = t.emailID 
    AND recipients.relation = 'course director' 
) 

我用条款EXISTS,所以你不会最终与重复emails记录。