用PHP创建消息系统

时间:2017-04-29 16:37:43

标签: php mysql

我正在尝试创建消息系统,我希望列出与最近聊天的用户进行交互的用户我知道这个问题也是重复但我无法弄清楚问题出在哪里 这是我的消息表结构

user_message

msgID   sentBy  sentTo  message     sentTime 
1         3     1       Hii B      1493306882
2         3     1       Hi A       1493309615
1         1     3       Hmm        1493306882
2         1     3       Yeah       1493309615

我试过的查询是

QUERY

SELECT * FROM user_message_status LEFT JOIN users ON user_message_status.userID=users.userID

LEFT JOIN user_message ON user_message_status.msgID=user_message.msgID WHERE user_message_status.userID='".$_SESSION['userid']."'

GROUP BY user_message_status.msgID ORDER BY user_message.msgID DESC

问题

1)当userA向用户B发送消息时,用户名称将打印在聊天列表中而不是收件人(userB)

2)发送或接收的消息量等于聊天中列出的用户数。

user_message_status :表格

msgstatusID     msgID   userID  box     read    readTime
  1              1        3     outbox   0         0
  2              1        1     inbox    0         0

这是读取未读邮件或删除

的状态表

1 个答案:

答案 0 :(得分:2)

首先将查询更新为以下内容:

SELECT * 
FROM user_message_status s
    LEFT JOIN users u  USING userID
    LEFT JOIN user_message m  USING msgID 
WHERE s.userID='".$_SESSION['userid']."'
GROUP BY user_message_status.msgID 
ORDER BY user_message.msgID DESC

因为两个表都有相同的列名,为了使你的SQL更短更整洁,你可以使用USING函数 LEFT JOIN users ON user_message_status.userID=users.userIDLEFT JOIN user_message ON user_message_status.msgID=user_message.msgID都已更改。然后,我们将表重命名为一个字母,这样您就不必编写整个表名。

为什么你的userA被发送是因为,你的查询会返回,让我说我是id'3',

msgstatusID    msgID    userID  box     read    readTime
1              1        3       outbox  0       0

因此,从联接开始,user_message将返回

msgID   sentBy  sentTo  message     sentTime 
1         3     1       Hii B       1493306882
1         1     3       Hmm         1493306882

所以你必须对名称使用if语句或转弯操作并说:

if (sentBy == $_SESSION['userid'])
    $name = sentTo;
else
    $name = sentBy;

OR

$name = (sentBy == $_SESSION['userid']) ? sentTo : sentBy;

基本上要显示您正在与谁交谈的正确名称,您需要先检查要使用的列名称

问题2的AS,如果要限制金额,则需要添加更多条件。也许你只想要发件箱,所以你需要放AND box = 'outbox'

以下sql应该帮助你

SELECT 
    s.msgId
    , m.message
    , (
        SELECT CONCAT(firstName, ' ', lastName) 
        FROM users 
        WHERE userId = CASE WHEN m.sentTo = s.userId 
        THEN m.sentBy 
        ELSE m.sentTo END
    ) AS chatWith
    , m.sentTime
    , s.read
FROM user_message_status s
    LEFT JOIN user_message m USING (msgID)
WHERE s.userID='".$_SESSION['userid']."'
ORDER BY m.msgID DESC

删除LEFT JOIN users u USING userID,因为它将被子查询

s.msgID //用于删除聊天对话

m.sentBy, m.sentTo, m.message, m.sentTime //您邮件的所有重要数据