这是我的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
所以我需要确保显示的唯一消息是最新的通信,而不管方向如何(即,与其他用户的最新消息,无论该用户是“发送者”还是“接收者”)。 / p>
我在这个网站上使用PHP / MYSQL。我已经尝试了数千种方法来做到这一点,但我无法弄明白。可能是我的数据库结构不正确。我将在线上几个小时(之后会不断检查),所以随时可以提出任何问题。
答案 0 :(得分: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
用户和方向是根据该用户是否为发件人而确定的。
如果您只对最新消息感兴趣,可以在此查询中添加LIMIT。
答案 1 :(得分: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
虽然我不知道哪些消息是传入或传出,但它似乎可以解决问题。当我有机会邀请一些实际用户时,我会知道它是否正常工作。