0

我有这个查询来获取两个用户之间的最后一条消息。

    SELECT  f.*
    FROM
            (
                SELECT  *
                FROM    messages a
                WHERE  (LEAST(a.sender, a.receiver), GREATEST(a.sender, a.receiver), a.timestamp) 
                        IN  (   
                                SELECT  LEAST(b.sender, b.receiver) AS x, 
                                        GREATEST(b.sender, b.receiver) AS y,
                                        MAX(b.timestamp) AS msg_time
                                FROM    messages b
                                GROUP   BY x, y
                            ) 
            ) f
    WHERE   :user_id IN (f.sender, f.receiver)
    ORDER   BY f.timestamp DESC

我在这里得到了它,对我来说有点复杂。

只有在:user_id没有删除对话的情况下,我才需要修改它以获取最后一条消息。

该表有 4 个重要字段:sender, receiver, sender_deleted, receiver_deleted.

当用户想要删除对话时,我运行查询将删除的字段设置为 1。

用户 4 已删除对话的表示例:

sender   receiver    sender_deleted     receiver_deleted         message

  4         17             1                   0           user 4 to 17 message
  17        4              0                   1           user 17 to 4 message

我需要修改上面的查询,所以如果:user_id = 4 它返回空,但如果:user_id = 17返回最后发送的消息。

我希望我能很好地解释我想要做什么。

4

1 回答 1

0

这应该做你正在寻找的东西:

SELECT  f.*
FROM
        (
            SELECT  *
            FROM    messages a
            WHERE  (LEAST(a.sender, a.receiver), GREATEST(a.sender, a.receiver), a.timestamp) 
                    IN  (   
                            SELECT  LEAST(b.sender, b.receiver) AS x, 
                                    GREATEST(b.sender, b.receiver) AS y,
                                    MAX(b.timestamp) AS msg_time
                            FROM    messages b
                            GROUP   BY x, y
                        ) 
        ) f
WHERE   (:user_id = f.sender AND f.sender_deleted != 1)
    OR (:user_id = f.receiver AND f.receiver_deleted != 1)
ORDER   BY f.timestamp DESC
于 2013-05-11T22:46:21.983 回答