你能用case来指定在MySQL中使用的连接吗?

时间:2012-05-18 02:33:22

标签: php mysql sql database

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

每条消息都有sourceUserIdfriendId,这些是发件人和收件人。

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

问题

由于我们列出了发送和接收用户,因此某些列是错误的方法,例如,如果当前用户的userId为1

  • 发送的邮件的sourceUserId为1
  • 收到的消息将有一个friendId为1

如果我尝试使用一个查询执行整个收件箱,那么我必须在sourceUserIdfriendId上进行两次连接,因为我无法分辨哪个是当前登录的用户。< / 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)

2 个答案:

答案 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)