php - 消息系统,显示对话列表

标签 php mysql wordpress

我使用 PHP 和 mysql 制作了一个小型消息系统。我已在消息表中将我的用户链接为senderreceiver。我可以列出两个用户之间的对话。但我无法找到一种方法来显示每次对话的 1 条消息结果!

假设我有用户 1、2 和 3。所以我的消息表可能如下所示:

===================================================================
    ID    ||    sender    ||    receiver    ||    text    ||    date
===================================================================
    1     ||       1      ||        2       ||    Hello!  ||    timestamp stuff
    2     ||       2      ||        1       ||      Hi!   ||
    3     ||       1      ||        3       ||    Boo!    ||

因此对话链接为

SELECT * FROM messages WHERE (sender=1 OR sender=2) AND (receiver=1 OR receiver=2);

这样我就可以得到两个用户之间的完整对话(非常简单)。

回到问题,如何从每个对话中获取 1 条消息?

我尝试过这样的事情:

(SELECT m.text,m.date,sender.username,receiver.username 
FROM messages AS m 
INNER JOIN users AS sender on m.sender=user.ID 
INNER JOIN users AS receiver ON receiver.ID=m.receiver 
WHERE m.sender=1 OR m.receiver=1
ORDER BY messages.date DESC LIMIT 1);

但显然这并没有达到我想要的效果,因为只返回一行。我想我知道我需要做什么,只是不知道该怎么做? 我想我需要这样的东西:

SELECT sender.username,receiver.username,m.text,m.date FROM messages AS m 
INNER JOIN users AS sender ON sender.ID=m.sender
INNER JOIN users AS receiver ON receiver.ID=m.receiver
LEFT JOIN (SELECT mes.ID 
              FROM messages AS mes
              WHERE mes.sender=1 OR mes.receiver=1 
              ORDER BY mes.date DESC LIMIT 1) AS convo
ON convo.ID=m.ID;

这样的东西有用吗?

如果你想查看我的完整 sql:

(SELECT sender.ID AS senderID,sender.username AS senderUsername,sender.firstname AS senderFirstname,sender.lastname AS senderLastname,sender.othername AS senderOthername,sender.url_name AS senderUrl_name,senderI.path as sender_default_image,
                                                        receiver.ID AS receiverID,receiver.username AS receiverUsername,receiver.firstname AS receiverFirstname,receiver.lastname AS receiverLastname,receiver.othername AS reciverOthername,receiver.url_name AS recieverUrl_name,receiverI.path as reciever_default_image,
                                                        messages.message,messages.date,messages.read
                FROM '.$wpdb->prefix.'fishy_messages AS messages
                INNER JOIN '.$wpdb->prefix.'fishy_users AS sender ON sender.ID=messages.sender
                LEFT JOIN '.$wpdb->prefix.'fishy_profile_default_image AS senderDP ON senderDP.userID=sender.ID
                INNER JOIN '.$wpdb->prefix.'fishy_users AS receiver ON receiver.ID=messages.receiver
                LEFT JOIN '.$wpdb->prefix.'fishy_profile_default_image AS receiverDP ON receiverDP.userID=receiver.ID
                LEFT JOIN '.$wpdb->prefix.'fishy_images AS senderI ON senderI.ID=senderDP.imageID
                LEFT JOIN '.$wpdb->prefix.'fishy_images AS receiverI ON receiverI.ID=receiverDP.imageID
                    WHERE messages.sender=%d OR messages.receiver=%d ORDER BY messages.date DESC LIMIT 1)

是的,我正在使用 wordpress :p

最佳答案

要返回单个结果,请在外部查询上指定 Limit 1,您已在 INNER 查询中给出。

SELECT sender.username,receiver.username,m.text,m.date FROM messages AS m 
INNER JOIN users AS sender ON sender.ID=m.sender
INNER JOIN users AS receiver ON receiver.ID=m.receiver
LEFT JOIN (SELECT mes.ID 
              FROM messages AS mes
              WHERE mes.sender=1 OR mes.receiver=1 
              ORDER BY mes.date DESC LIMIT 1) AS convo
ON convo.ID=m.ID GROUP BY convo.ID ;

关于php - 消息系统,显示对话列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33199819/

相关文章:

php - 检索值 mysqli_fetch

php - 数据库从实时服务器同步到本地计算机

php - 根据发送时间使用 AJAX 脚本检索聊天消息

mysql - 根据另一个表自动将数据插入到表中

python - 如何避免在我的代码片段中使用\xc2 字符或 ?

php - 奇怪的文字溢出页面

php - 将新文件名存储在 mysql 数据库中 verot class.upload.php

mysql - 在单一数据库、 Multi-Tenancy (SQL) 上设计 SaaS

ruby-on-rails - Wordpress 能否被 Django 或 Ruby on Rails 等框架取代?

php - 如何完全禁用 WooCommerce 产品类型的运输?