重新发布:查询消息theard列表

时间:2013-04-01 07:07:23

标签: php mysql sugarcrm

好吧我再次发布同样的问题但是这次可能会有其他解决方案。

我有以下字段的消息表。

1)id(pk),from_id(fk),to_id(fk),date_entered,message

我的要求如下。

我需要向其他用户显示登录用户的最后一条消息。 e.g。

“mahendra”是一个登录用户与“john”进行通信的5个消息,并带有“smith”3消息。

在这5和3条消息中,登录用户(mahendra)可以是发送者(from_id)或接收者(to_id)

我需要向每个用户显示与登录用户的最后一次通信。像这样的东西

1)mahendra-john - 这是mahendra和john之间的最后一条消息 2)mahendra-smith - 这是mahendra和smith之间的最后一条消息

在我的上一篇文章中,我无法获得查询来实现此目的。所以这就是我所做的。

$result=mysql_query("SELECT * FROM messages WHERE from_id=$_SESSION['userid'] OR to_id=$_SESSION['userid'] ORDER BY date_entered DESC");

现在我有登录用户是发件人或收件人的所有记录。

现在我需要过滤其他用户(john和smith)和mahendra中的最后一条消息并将其带入其他数组;

知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

SELECT  b.Name Fromname,
        c.name ToName,
        a.date_entered,
        a.Message
FROM
        (
            SELECT  *
            FROM    Messages
            where   (LEAST(from_id, to_id), GREATEST(from_id, to_id), date_entered) IN
                    (
                        SELECT  LEAST(from_id, to_id) as fromID, 
                                GREATEST(from_id, to_id) as toID, 
                                MAX(date_entered) as date_entered
                        FROM    Messages 
                        GROUP   BY fromID, toID
                    )
        ) a
        INNER JOIN UserList b
            ON a.from_id = b.ID 
        INNER JOIN UserList c
            ON a.to_ID = c.ID
WHERE   'Mahendra' IN (b.name, c.Name)

简要说明

让我们分解完整的查询。查询的核心是这个,

SELECT  *
FROM    Messages
where   (LEAST(from_id, to_id), GREATEST(from_id, to_id), date_entered) IN
        (
            SELECT  LEAST(from_id, to_id) as fromID, 
                    GREATEST(from_id, to_id) as toID, 
                    MAX(date_entered) as date_entered
            FROM    Messages 
            GROUP   BY fromID, toID
        )

查询的作用是通过在MySQL中使用MessagesLEAST()函数,获取GREATEST()表中每个用户的最新会话。在表UserList包含用户名列表的表)上加入子查询两次的原因是因为有两列:from_idto_id依赖于这张桌子。

答案 1 :(得分:0)

也许您想查看一下,在SQL Fiddle

中回答

这是我的疑问:

SET @user_id = 1;

SELECT COUNT(M.Id) AS MessageCount 
    , IF(M.from_id = @user_id, M.to_id, M.from_id) AS CommunicatedWith
    , (SELECT message FROM messages WHERE id = MAX(M.id)) AS LastMessage
    FROM messages AS M
    WHERE M.from_id = @user_id OR M.to_id = @user_id
    GROUP BY CommunicatedWith;

这只是查询版本,如果您使用的是stored procedure,我建议您使用本地变量替换会话变量@user_id