1

我有一个 usermessages 表,其中存储了站点上两个用户之间发送的所有消息。

每条消息都有一个sourceUserId和一个friendId,它们是发送者和接收者。

每个用户消息收件箱都列出了所有发送和接收的消息,每条消息都显示了哪个用户发送或接收了该消息。

问题

当我们列出发送和接收用户时,有些列是错误的,例如如果当前用户的 userId 是 1

  • 发送的消息的 sourceUserId 为 1
  • 收到的消息的friendId为1

如果我尝试用一​​个查询完成整个收件箱,那么我目前必须对两者进行两次连接sourceUserIdfriendId因为我无法判断哪个是当前登录的用户。

我已经知道当前登录用户的用户名,所以当只需要一个时,有两个连接似乎不正确?

我想知道是否可以在 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)
4

2 回答 2

2

您需要改用CASEforON子句

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

于 2012-05-18T02:43:51.770 回答
1

另一种方法,而不是使用 case when,以布尔方式执行:

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)
于 2012-05-18T03:13:01.683 回答