PHP / MYSQL - 显示多列的最新值

时间:2013-01-09 02:55:28

标签: mysql select private-messaging

这是我的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。我已经尝试了数千种方法来做到这一点,但我无法弄明白。可能是我的数据库结构不正确。我将在线上几个小时(之后会不断检查),所以随时可以提出任何问题。

2 个答案:

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

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

相关问题