用mysql查询邮件检索

时间:2013-01-11 17:43:34

标签: php mysql select union

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

I 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个查询以显示所有对话。有关如何实现此目的的任何帮助,或者如果有更好的方法来设置邮件系统,将不胜感激。

我还没有想出任何可靠的方法来实现这一目标。有人能够解决一些问题吗?

1 个答案:

答案 0 :(得分: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