我有一个邮件表,我需要在一个查询中检索所有当前用户的传入和传出邮件。当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个查询以显示所有对话。有关如何实现此目的的任何帮助,或者如果有更好的方法来设置邮件系统,将不胜感激。
我还没有想出任何可靠的方法来实现这一目标。有人能够解决一些问题吗?
答案 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