gpt4 book ai didi

php - 在 PHP 中创建消息系统

转载 作者:可可西里 更新时间:2023-11-01 08:24:35 25 4
gpt4 key购买 nike

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

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.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 语句或 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com