我正在尝试创建消息系统,我想在其中列出与最近聊天互动过的用户,我知道这个问题也是重复的,但我无法弄清楚问题出在哪里 这是我的消息表结构
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
我试过的查询是
查询
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给userB发消息时,聊天列表中打印的是userA的名字,而不是recipient(userB)
2) 发送或接收的消息数量等于聊天中列出的用户数量。
user_message_status: 表
msgstatusID msgID userID box read readTime
1 1 3 outbox 0 0
2 1 1 inbox 0 0
这是读取未读消息或删除的状态表
最佳答案
首先将查询更新为以下内容:
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
语句或 turnary 操作来命名并说:
if (sentBy == $_SESSION['userid'])
$name = sentTo;
else
$name = sentBy;
或
$name = (sentBy == $_SESSION['userid']) ? sentTo : sentBy;
基本上要显示您正在与谁交谈的专有名称,您需要先检查使用哪个列名
对于问题2,如果你想限制数量,那么你需要添加更多的条件。也许你只想要发件箱,所以你需要输入 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
//消息的所有重要数据
关于php - 在 PHP 中创建消息系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43698064/