【问题标题】:MySQL Complex Query, user conversationMySQL 复杂查询,用户对话
【发布时间】:2013-05-11 20:20:38
【问题描述】:

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

    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

我在 SO 中得到它,对我来说有点复杂。

只有在: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返回最后发送的消息。

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这应该可以满足您的需求:

    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
    

    【讨论】:

    • 我做了一个快速测试,似乎可以正常工作。谢谢!我快疯了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2012-11-17
    • 2015-07-28
    相关资源
    最近更新 更多