php - 在 PHP 中创建消息系统

标签 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

我试过的查询是

查询

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/

相关文章:

php - MySQL在使用$_REQUEST获取值后插入NULL值

php - 如何从 lambda 函数访问父对象?

php - 我想使用 php 和 mysql 向数据库中的每个电子邮件地址发送电子邮件

mysql - SQL 包含不返回任何结果

MySQL:可以根据每个收到订单的金额计算总库存成本吗?

PHP:使用单词 'and' 的语法是什么意思?

php - 将 Windows 时区转换为 PHP 设置的等效时区

php - 将 php 多维数组分配给 javascript 数组

php - Laravel - 尝试获取非对象形式错误的属性

mysql使用返回x行数的子查询更新或插入到另一个表