1

我有一个邮件表,我需要在一个查询中检索所有当前用户的传入和传出邮件。当 php 循环遍历结果时,它会根据发送或接收的最新消息构建一个主视觉对象,然后需要构建与该最近消息相关的先前消息视觉对象(这将在页面下方的最新消息下看到) . 我的邮件表是这样设置的:

一世d(auto_incr), from_user(user id number), to_user(user id number),
orig_mess(id number of the first message in conversation),
status(0 for unread, 1 for read)

与任何邮件收件箱一样,我需要按如下顺序获取结果:1)发送给登录用户的未读消息(按 id 排序),然后是最新消息之后的每个对话中的任何先前消息

2)阅读发送给登录用户的消息或从登录用户发送的消息(全部按他们的ID排序),然后当然是最新消息之后与每个对话相关的任何先前消息

到目前为止,这是我所做的:

     $result = mysql_query("(SELECT id FROM Mail WHERE Mail.to_user='37' AND   
       Mail.status='0' ORDER BY Mail.id DESC) UNION (SELECT id FROM Mail WHERE   
(Mail.to_user='37' AND Mail.status='1') OR   
(Mail.from_user='37') ORDER BY Mail.id DESC)")or die(mysql_error());

我已经完成了我正在寻找的结果,使用查询来获取每个对话中的每条最新消息,然后为每个对话执行另一个查询。这样做的问题是,如果用户在其邮箱中有 20 个对话,则会发生 21 个查询以显示所有对话。任何有关如何完成此操作或是否有更好的方法来设置邮件系统的帮助将不胜感激。

我仍然没有想出任何可靠的方法来实现这一点。任何人都可以阐明一些光?

4

1 回答 1

0

我认为这样的事情应该有效。这将在同一个查询中同时提取已发送和已接收的消息,并首先按具有最新未读消息的对话排序,然后是最新已读消息。

SELECT   <any fields you want>

FROM     Mail as m

     JOIN

     (SELECT  orig_mess, id, status
      FROM    Mail 
      WHERE   Mail.from_user='37' OR Mail.to_user='37'
      ) as latest ON m.orig_mess = latest.orig_mess
      AND latest.id = (SELECT  id  
                       FROM    Mail  
                       WHERE   from_user='37' OR to_user='37' 
                               orig_mess = latest.orig_mess
                       ORDER BY status asc, id DESC  
                       LIMIT 1)

WHERE    m.from_user='37' OR m.to_user='37'   

ORDER BY latest.status, latest.id DESC, m.status, m.id DESC
于 2013-01-11T18:23:06.283 回答