2013-05-11 93 views
0

我有這個查詢來獲取兩個用戶之間的最後一條消息。MySQL複雜查詢,用戶對話

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返回最後發送的消息。

我希望我解釋清楚我想做什麼。

回答

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 
+0

我做了一個快速測試,而且似乎工作,我想要的。謝謝!我瘋了 – Fr0z3n 2013-05-11 23:30:55