也许有更好的方法来做到这一点......我有一张会员朋友请求表。列是request_id,author_id,recipient_id,status(已接受或已拒绝)。我还有一个成员表,其id链接到作者或收件人。我想通过从成员表中选择然后加入请求表来获取成员朋友的列表。由于该成员可以是任何,一些或没有请求的作者或接收者,因此简单的LEFT JOIN member_requests AS r ON member_id = r.author_id将不起作用。如何编写将执行此操作的查询?
SELECT
m.member_id, m.display_name
r.author_id, r.recipient_id, r.status
FROM members AS m
LEFT JOIN member_requests AS r ON m.member_id = r.recipient_id
WHERE r.status = 1 --Accepted
ORDER BY m.display_name
答案 0 :(得分:1)
您可以在左连接中使用OR,如下所示:
LEFT JOIN member_requests AS r
ON m.member_id = r.recipient_id
OR m.member_id = r.author_id
但是,你的where子句也需要改变:
SELECT
m.member_id, m.display_name
r.author_id, r.recipient_id, r.status
FROM members AS m
LEFT JOIN member_requests AS r
ON (m.member_id = r.recipient_id
OR m.member_id = r.author_id)
AND r.status = 1 //Accepted
ORDER BY m.display_name
当您将表A连接到表B,然后在表B上的where子句中指定限制时,将左连接转换为内连接。通常,表B的左连接会产生一些空值,因为表A可能有不会加入表B的记录。但是如果你说'表B.value = x',您将连接限制为只有表A连接到表B的行,以及其中' B.value = x'的行。然后将连接评估为内连接,而不是左外连接。