繁体   English   中英

重新发布:查询消息列表

[英]Repost : Query messages theard list

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

我有带有以下字段的消息表。

1)id(pk),from_id(fk),to_id(fk),输入日期,消息

我的要求如下。

我需要向登录用户显示与其他用户的最新消息。 例如

“ 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");

现在,我有了所有登录用户为发送者或接收者的记录。

现在,我需要过滤其他用户(约翰和史密斯)和mahendra中的最后一条消息,并将其放入其他数组中;

知道怎么做吗?

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中的LEAST()GREATEST()函数,从Messages表中获取每个用户的最新对话。 两次在表UserList包含用户名列表的表)上加入子查询的原因是因为有两列: from_idto_id依赖于此表。

也许您想检查一下,在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变量@user_id替换为本地变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM