我正在尝试创建消息系统,我希望列出与最近聊天的用户进行交互的用户我知道这个问题也是重复但我无法弄清楚问题出在哪里 这是我的消息表结构
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
这是读取未读邮件或删除
的状态表答案 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.userID
和LEFT 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
//您邮件的所有重要数据