1

好吧,我再次发布相同的问题但是这次使用可能有效的替代解决方案。

我有以下字段的消息表。

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

我的要求如下。

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

“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 中的最后一条消息并将其放入其他数组;

知道怎么做吗?

4

2 回答 2

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
        )

Messages查询的作用是借助MySQL中的使用LEAST()和功能从表中获取每个用户的最新对话。两次加入表(包含用户名列表的表GREATEST())上的子查询的原因是因为有两列:,依赖于该表。UserListfrom_idto_id

于 2013-04-01T07:20:41.253 回答
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为本地变量。

于 2013-04-01T07:59:57.550 回答