我有一个usermessages表,其中存储了站点上两个用户之间发送的所有邮件。
每条消息都有sourceUserId
和friendId
,这些是发件人和收件人。
每个用户消息收件箱都会列出所有已发送和已接收的消息,每条消息都会显示哪个用户已发送或接收该消息。
问题
由于我们列出了发送和接收用户,因此某些列是错误的方法,例如,如果当前用户的userId为1
如果我尝试使用一个查询执行整个收件箱,那么我必须在sourceUserId
和friendId
上进行两次连接,因为我无法分辨哪个是当前登录的用户。< / p>
我已经知道当前登录用户的用户名,所以当只需要一个联接时,有两个联接似乎不正确吗?
我想知道是否可以在mysql查询中使用某种情况来有效地实现以下操作并减少每次必须查找的数据量。
SELECT um.message, UNIX_TIMESTAMP(um.time), um.read, user.username
FROM usermessages um
CASE
WHEN um.friendId = 1
INNER JOIN user ON um.sourceUserId = user.id
WHEN um.sourceUserId = 1
INNER JOIN user ON um.friendId = user.id
END
WHERE (um.friendId = 1 OR um.sourceUserId = 1)
答案 0 :(得分:2)
您需要使用CASE
代替ON
子句
SELECT um.message, UNIX_TIMESTAMP(um.time), um.read, user.username
FROM usermessages um
INNER JOIN user ON
CASE
WHEN um.friendId = 1 THEN um.sourceUserId
ELSE um.friendId
END = user.id
WHERE (um.friendId = 1 OR um.sourceUserId = 1)
(或者如果您更喜欢,请在= user.id
内移动比较CASE
)
答案 1 :(得分:1)
另一种方法,而不是使用大小写,以布尔方式执行:
SELECT um.message, UNIX_TIMESTAMP(um.time), um.read, user.username
FROM usermessages um
INNER JOIN user ON
(um.friendId = 1 AND um.sourceUserId = user.id)
OR
um.friendId = user.id
WHERE (um.friendId = 1 OR um.sourceUserId = 1)