首页 > 解决方案 > 如何从基于 2 列的表中获取最新行并且不相互冲突?

问题描述

这基本上是我正在创建的另一个系统的私人消息系统。我有一个设置了 id、发送器、接收器、消息的表。发射器和接收器是数字。

当前系统已设置为每个用户都有自己的唯一编号。当他们向另一个用户发送消息时,它会将其插入表中。这样,发射器和接收器将具有用户的两个值。

我想向用户显示他们发送的每个号码,并显示他们对话中的最后一条消息(其他一切都很好,就像显示单个对话中的所有消息一样),无论是来自该用户还是其他用户。

我知道这可能没有很好地解释它,所以我会尝试使用一个例子

发射器,接收器,消息

456, 123, Hi!
456, 789, I have a question
456, 789, Can you help?
789, 456, Yes

因此,在示例中,我们有 123、456、789。为此,我们将是 456。在我们这边,我们应该看到 123、789。123 的最新消息应该是 Hi!最新的 789 应该是 Yes。如果我们要回复 789,我们的消息将是最新的,或者如果 123 回复了,那么这将是 123 对话的最新消息。

我希望我能够解释一切,并希望这个例子有所帮助。

标签: mysql

解决方案


AUNION听起来像你会发现有用的东西:

SELECT * FROM (
    SELECT *
    FROM (
        SELECT *
        FROM `phone_messages`
        WHERE `transmitter` = ###
        ORDER BY `time` DESC
        LIMIT 1
    ) AS `last_sent`

    UNION

    SELECT *
    FROM (
        SELECT *
        FROM `phone_messages`
        WHERE `receiver` = ###
        ORDER BY `time` DESC
        LIMIT 1
    ) AS `last_received`
) AS `last_message`
ORDER BY `time` DESC
LIMIT 1

第一段将为您提供相关人员 ID 发送的最后一条消息。

第二部分将为您提供相关人员 ID 收到的最后一条消息。

外部选择为您提供这两者中的最新选择。


推荐阅读