2

这是我的mysql表结构:

msgid | senderid | sender | recipientid | recipient | title | message | date 

我希望在收件箱中显示我的私人消息系统,就像 Facebook 所做的那样。也就是说,无论是传入还是传出,每个对话都会从表中输出一次。例如:

My username is 'admin'.

USER   |   MESSAGE       |   DATE   |  DIRECTION
Dan    | Hello           |  1/2/10  | Incoming
Bob    | How are you Bob?|  30/1/10 | Outgoing

由于方向不同,问题不在于重复用户名。例如:

USER   |   MESSAGE       |   DATE   |  DIRECTION
Dan    | Hello           |  1/2/10  | Incoming
Bob    | How are you Bob?|  30/1/10 | Outgoing
Bob    | Hi admin        |  30/1/10 | Incoming

所以我需要确保显示的唯一消息是最新的通信,无论方向如何(即,与另一个用户的最新消息,无论该用户是“发送者”还是“接收者”)。

我在这个网站上使用 PHP/MYSQL。我已经尝试了数千种方法来做到这一点,但我就是想不通。可能是我的数据库结构不正确。我将在线几个小时(之后会不断检查),所以请随时提出任何问题。

4

2 回答 2

1

如果我理解正确,这应该可以满足您的需要:

SELECT
IF(senderid = :userId,recipient,sender) AS USER,
message,
date,
IF(senderid = :userId,'Outgoing','Incoming') AS DIRECTION
FROM message 
WHERE senderid = :userId OR recipientid = :userId 
ORDER BY date DESC

USER 和 DIRECTION 取决于此用户是否为发送者。

如果您只对最新消息感兴趣,可以向此查询添加 LIMIT。

于 2013-01-09T03:08:19.277 回答
0

我已经通过以下方式解决了我自己的问题:

SELECT * FROM (
    SELECT * FROM (
         (SELECT id, reciever, recieverid, message, datetime FROM messages WHERE sender = '$user')
       UNION
          (SELECT id, sender, senderid, message, datetime FROM messages WHERE reciever = '$user')
          ) as t
       ORDER BY datetime DESC
    ) as t2
GROUP BY reciever ORDER BY datetime DESC

它似乎可以解决问题,尽管我不知道哪些消息是传入或传出的。当我有机会邀请一些实际用户时,我会知道它是否正常工作。

于 2013-01-09T07:34:59.667 回答