Mysql SQL,在两人之间的对话中查找最新条目

Mysql SQL,在两人之间的对话中查找最新条目,mysql,sql,Mysql,Sql,我有一个表,Messages,如下所示: 此表存储人与人之间发送的所有消息,但它需要像FaceBook的消息系统一样 为此,我的查询需要类似于: 从消息中选择*到_User=x或从_User=x按时间顺序描述 这会让我按时间顺序获取发送或接收到的每一条消息“x”,最新的消息首先出现 然而,Facebook的系统让它有点像一个论坛,所以我只想要一条消息,其中y个人参与任何给定的查询结果。所以我不希望这种情况发生: 致用户:6 用户:7 状态:我同意你的信息 时间:12345 致用户:7 致用户:

我有一个表,Messages,如下所示:

此表存储人与人之间发送的所有消息,但它需要像FaceBook的消息系统一样

为此,我的查询需要类似于:

从消息中选择*到_User=x或从_User=x按时间顺序描述

这会让我按时间顺序获取发送或接收到的每一条消息“x”,最新的消息首先出现

然而,Facebook的系统让它有点像一个论坛,所以我只想要一条消息,其中y个人参与任何给定的查询结果。所以我不希望这种情况发生:

致用户:6 用户:7 状态:我同意你的信息 时间:12345

致用户:7 致用户:6 状态:你同意我的信息吗? 时间:12344

假设我为用户6显示消息页面,这两条消息都会显示在我当前的系统中。 相反,应该只选择最上面的消息,因为我只想显示用户6和7之间的最新消息,而不是每个消息

当然,这通常只是要求一个限制声明,但我需要能够得到很多信息,但唯一的规则是:

1-它需要来自或到用户X 2-不得选择来自或发送给用户Y的两条消息 3-所选消息必须是用户X和Y之间对话中的最新消息

这真的很难描述,但我希望我已经描述了足够详细的解决方案

我曾考虑过分组,但我不能让它考虑到它需要找到一个来自或对我而言,而不仅仅是来自或仅来自

如果这个问题描述得不够详细,请在否决表决前告诉我,我会尽力让它更详细一点,但我想不出用什么词来描述需要清楚显示的内容

编辑:

下面是所需功能的一个重要示例:

假设我给JohnDoe发了一条信息,然后直接进入了我的信息页面,最上面会说

“致无名氏” “我发送的消息”

但是,如果John Doe回复,该条目将不再显示在页面上,它将被我和John Doe之间对话中的最新条目替换,因此当实际条目仍在数据库中时,它将不再显示:

“来自约翰·多伊” “你的消息很有趣”

但如果我在事后给简·多伊发了一封信,它会推动我和约翰·多伊的对话,所以看起来是这样的:

“致无名氏” “你好”

“来自约翰·多伊” “你的消息很有趣”

现在我在这篇文章中提出的第一个问题的结果是:

“致无名氏” “你好”

“来自约翰·多伊” “你的消息很有趣”

“致无名氏” “我发送的消息”

然而,我不想显示我和John Doe之间的多个列,但由于我查看表中的两个不同列(From和two),以确定我和John Doe是否相关,因此我认为常规的GROUP BY语句不起作用

现在,如果另外Bob Joe给我发了一条消息,它可能看起来像:

“来自鲍勃·乔” “你好”

“致无名氏” “你好”

“来自约翰·多伊”
“您的消息很有趣”

您可以自联接表并使用外部联接,以便任何“较早”的消息将“过滤”任何“非较早”的消息

SELECT * FROM Messages main LEFT JOIN Messages earlier
    ON earlier.time < main.time AND 
        (
            earlier.To_User = main.To_User AND earlier.From_User = main.From_User OR  
            earlier.To_User = main.From_User AND earlier.From_User = main.To_User
        )
WHERE (main.To_User = x OR main.From_User = x) AND earlier.id IS NULL
ORDER BY main.Time DESC
SELECT*FROM Messages main LEFT JOIN Messages
在较早的.time
如果您可以消除出现在“发件人”或“收件人”列中的人员的复杂性,那么这将是查找组中最小行的常见问题之一。所以你可以从这个开始:

SELECT id, time, to_user as user
UNION ALL SELECT id, time, from_user as user

然后使用该查询的结果作为任何标准的输入。

我假设您使用的是MySQL,对吗?我无法理解这个问题:极限有什么问题?你能给我们一个真实的用例例子吗?我想我理解这个问题,但我同意Crano的观点。如果你给出一个你想做什么的实际例子,那么理解你的问题就会容易17倍。示例输入,预期输出。我会举个例子,给我一点时间编辑。不幸的是,我无法摆脱他们在其中的任何一个,我需要保持跟踪,以便我知道谁发送了个人消息我不是说改变你原来的表结构;我的意思是使用
SELECT
query的结果作为最小行技术的输入。啊,误解了你的答案,对不起。谢谢,我现在就尝试一下,如果它有效的话,我会接受的。对不起,我这没有返回任何内容,我已经将x更改为有效ID(包含消息),并及时更正了未资本化的t(但我不确定资本化是否重要).你知道为什么吗?@AshleyDavies-我看没有太多空间让它不起作用。你的数据库引擎是什么?如果你删除前面对
的检查。id为NULL
,你会看到什么数据?你是使用完全相同的查询,还是将它嵌入到更大的查询中?你如何提供
x
?@AshleyDavies-mysql中的列名不区分大小写ve,但某些操作系统上的表名可能是。关于PHP问题,我认为如果您在查询中用
main.*
替换
*
,这会有所帮助。也许您甚至必须用PHP打印特定列。@AshleyDavies-因为您忘了在前面输入
。id为NULL