Php 用mysql查询邮件检索

Php 用mysql查询邮件检索,php,mysql,select,union,Php,Mysql,Select,Union,我有一个邮件表,我需要在一个查询中检索当前用户的所有传入和传出邮件。当php在结果中循环时,它会根据最近发送或接收的消息构建一个主要的视觉效果,然后需要构建与最近一个相关的先前消息视觉效果,这将在页面的最新消息下面看到。我的邮件表设置如下: idauto_incr,从用户id号到用户id号, 对话中第一条消息的原始编号, 状态0表示未读,1表示已读 与任何邮件收件箱一样,我需要按如下方式获得结果: 1发送给已登录用户的未读消息按id排序,然后在最新的 2阅读发送给已登录用户的消息或从已登录用户发

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

idauto_incr,从用户id号到用户id号, 对话中第一条消息的原始编号, 状态0表示未读,1表示已读

与任何邮件收件箱一样,我需要按如下方式获得结果: 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个查询显示所有对话。如果能为我提供帮助,或者有更好的方法来建立邮件系统,我将不胜感激


我仍然没有找到任何可靠的方法来实现这一点。有人能解释一下吗?

我想这样的办法应该行得通。这将在同一查询中提取已发送和已接收的消息,并首先按最新未读消息的对话排序,然后按最新已读消息排序

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

这到底是如何运行多个查询的?我目前没有使用这种格式。目前,我使用一个广泛的选择查询来获取发送或接收给用户的最新消息。循环浏览结果。在循环中运行另一个查询,选择与当前循环中的消息相关的任何其他消息。我觉得这很有希望。当我运行它时,虽然我在字段列表中得到了错误列“id”,但它是不明确的。下面是我的精确查询:$result2=mysql\u querySELECT id FROM Mail as m JOIN SELECT orig\u mess,id,status FROM Mail WHERE Mail.to\u user='37'或Mail.FROM\u user='37'按状态订购asc,id DESC LIMIT 1 as latest ON m.orig\u mess=latest.orig\u mess WHERE Mail.to\u user='37'或Mail.FROM\u user='37'按最新状态订购,latest.id DESC,id DESCor dieu错误;在主SELECT部分中,将邮件表中的任何字段前缀为m..I,通过在最终where子句中使用原始别名消除了错误。但现在它只返回一个值。更新查询:选择m.id、m.to\u用户、m.from\u用户作为m加入从Mail WHERE Mail.to\u user='37'或Mail.from\u user='37'按状态asc订购,id DESC LIMIT 1作为m.orig\u mess=latest.orig\u mess其中m.to\u user='37'或m.from\u user='37'按最新状态订购,latest.id DESC,id DESC,id DESC或diemysql\u错误;很抱歉。我对它做了一些编辑。现在试试。它确实可以这样工作,但仍然只返回一行。我想知道我是怎么做的,这是错误的方式lol。