0

我附上了一张带有数据的表格图像。现在,此表存储用户发送给他人和接收的所有消息。我想显示类似 facebook 个人消息的内容,其中用户和其他用户之间的最新消息显示在列表中,并且当用户单击该消息时,显示这两个用户之间的整个线程。我已经尝试了很多,但找不到正确显示它的方法。

该表将存储所有好友用户和非好友用户的消息。所以我想只获取那些给我发消息的用户的消息列表。

我不确定我的数据库设计是否正确?请帮助我提出建议或帮助如何实现我的要求。


编号 | 发件人 ID | 接收者 ID | is_read | 留言 | parent_id | 发送日期 | is_sender_deleted | is_receiver_deleted|

1 |5 |4 |0 |你好吗?|0 |2012-08-20 17:33:54 |0 |0
2 |4 |5 |0 |hiiiiiiii |0 |2012-08-20 17:35:02 |0 |0  
3 |5 |4 |0 |我在测试 |0 |2012-08-20 17:35:02 |0 |0  
4 |4 |5 |0 |Helloooooo |0 |2012-08-20 17:35:33 |0 |0  
5 |5 |4 |0 |你好回复 |0 |2012-08-20 17:47:41 |0 |0  
8 |6 |5 |0 |Hiii...Inx 这里|0 |2012-08-20 18:59:18 |0 |0  
9 |5 |6 |0 |是的,伙计....?|0 |2012-08-20 19:00:07 |0 |0  
4

1 回答 1

3

您的问题不太清楚您要做什么。您似乎需要一个查询,将来自每个 sender_id 的最新消息返回到特定的给定接收器 ID。

如果您无权访问 SQL 客户端程序(如果您尝试在没有 SQL 客户端程序的情况下使用 PHP 或 Java 进行开发),请获得对 SQL 客户端的访问权。没有它,将很难发展。

我们需要弄清楚每个发件人发送的最新消息,以及发件人发送了多少条消息。这需要一个摘要查询。让我们假设 message.id 字段是一个自动增量字段,并且最新消息具有最高 id。

     SELECT sender_id, MAX(id) id, COUNT(id) message_count
       FROM message
      WHERE receiver_id = 'receiver id to use'
        AND is_sender_deleted = 0
        AND is_receiver_deleted = 0
   GROUP BY sender_id

这将为我们提供发件人的最新消息列表,以及来自该发件人的所有消息的计数。看到这个 sqlfiddle: http ://sqlfiddle.com/#!2/caff6/1/0

现在,让我们使用该摘要查询来选择消息文本和其他好东西。

      SELECT m.sender_id, s.message_count, m.sent_date, m.message
        FROM message m
        JOIN (
               SELECT sender_id, MAX(id) id, COUNT(id) message_count
                 FROM message
                 WHERE receiver_id = 'receiver id to use'
                  AND is_sender_deleted = 0
                  AND is_receiver_deleted = 0
             GROUP BY sender_id 
             )s
          ON m.id = s.id 
    ORDER BY m.sent_date desc, m.sender_id

该结果集针对特定receiver id to use的 显示来自每个发件人的消息数量、最新消息的文本和时间以及发件人身份的列表。这是一个 sqlfiddle:http ://sqlfiddle.com/#!2/caff6/3/0

receiver id to use一旦您知道and ,检索从特定发送者到特定接收者的所有消息应该是一个简单的查询sender id to use

     SELECT *
       FROM message 
      WHERE sender_id = 'sender id to use'
        AND receiver_id = 'receiver id to use'
        AND is_sender_deleted = 0
        AND is_receiver_deleted = 0
   ORDER BY sent_date DESC
于 2012-08-20T15:48:22.527 回答