2017-08-18 32 views
-3

我有這樣MySQL的獨特2列的組合由另一列值進行排序

------------------------------------------ 
message_id | sender_id | receiver_id | message 
------------------------------------------ 

1 | 101 | 102 | hello 
2 | 102 | 101 | i am fine 
3 | 103 | 101 | where are you? 
4 | 101 | 103 | i am at my home 
5 | 103 | 101 | ok 
6 | 101 | 102 | so whats up? 
7 | 102 | 104 | i am so busy 
8 | 105 | 101 | hey 

樣本數據我想從在其中用戶101是參與者

期待輸出

每個對話的最新消息
8 | 105 | 101 | hey 
6 | 101 | 102 | so whats up? 
5 | 101 | 103 | i am at my home 

我需要mysql查詢這個。

在此先感謝。

+0

是的,我需要每個對話的最新行。其所有的一對一對話。 不是一個羣聊 – panchayat

回答

1

例如爲:

SELECT a.* 
    FROM my_table a 
    JOIN 
    (SELECT LEAST(sender_id,receiver_id) user1 
      , GREATEST(sender_id,receiver_id) user2 
      , MAX(message_id) message_id 
     FROM my_table 
     WHERE 101 IN (sender_id,receiver_id) 
     GROUP 
      BY user1 
      , user2 
    ) b 
    ON b.message_id = a.message_id; 

或只是

SELECT a.* 
    FROM my_table a 
    JOIN 
    (SELECT MAX(message_id) message_id 
     FROM my_table 
     WHERE 101 IN (sender_id,receiver_id) 
     GROUP 
      BY LEAST(sender_id,receiver_id) 
      , GREATEST(sender_id,receiver_id) 
    ) b 
    ON b.message_id = a.message_id; 

這也可以寫成。我懷疑它使太大的區別,以性能...

SELECT a.* 
    FROM my_table a 
    JOIN 
    (SELECT MAX(message_id) message_id 
     FROM 
      (SELECT message_id 
        , receiver_id user2 
       FROM my_table 
       WHERE sender_id = 101 
       UNION 
       SELECT message_id 
        , sender_id 
       FROM my_table 
       WHERE receiver_id = 101 
      ) x 
     GROUP 
      BY user2 
    ) b 
    ON b.message_id = a.message_id; 

其實,在我自己的有限的測試,第一個查詢中的最後一名的一半的時間完成。

+0

沒有工作:( – panchayat

+0

查詢是好的。無論哪種方式,「沒有工作」是不是SO可接受的響應。 – Strawberry

+0

我由信息ID添加說明爲了現在它按預期工作。感謝您的幫助。 它走0.65sec有什麼辦法優化?我有大約1.8十億行 – panchayat

-2

您可以使用此命令

SELECT * FROM table_name WHERE sender_id=101 OR receiver_id =101 

這將整理數據,給你需要的結果

-1

如果你給位代碼或文件的SQL將是很好的回答你的問題。 試試這個:

$query = mysqli_query($connection," SELECT * FROM your table WHERE sender_id = '101' OR receive_id = '101' GROUP BY message_id "); 
return $query; 
+0

消息ID已經是唯一的原因組呢? – panchayat

相關問題