首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Repost :查询消息列表

Repost :查询消息列表
EN

Stack Overflow用户
提问于 2013-04-01 15:07:23
回答 2查看 75关注 0票数 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)马亨德拉-约翰-这是马亨德拉和约翰之间的最后一条消息2)马亨德拉-史密斯-这是马亨德拉和史密斯之间的最后一条消息

在我的上一篇文章中,我无法通过查询来实现这一点。这就是我所做的。

代码语言:javascript
复制
$result=mysql_query("SELECT * FROM messages WHERE from_id=$_SESSION['userid'] OR to_id=$_SESSION['userid'] ORDER BY date_entered DESC");

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

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

你知道怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-01 15:20:41

代码语言:javascript
复制
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)

  • SQLFiddle Demo

简要说明

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

代码语言:javascript
复制
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
        )

  • SQLFiddle Demo

查询的作用是借助Messages中的LEAST()GREATEST()函数从MySQL表中获取每个用户的最新会话。在表UserList (一个包含用户名列表的表)上连接子查询两次的原因是,这个表有两个列:from_idto_id dependent。

票数 2
EN

Stack Overflow用户

发布于 2013-04-01 15:59:58

也许你想看看这个,用SQL Fiddle回答

下面是我的问题:

代码语言:javascript
复制
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;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15739154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档