2017-10-10 40 views
-1

以下是聊天消息和用戶的表結構。MySQL查詢獲取最新的獨特聊天對話

我希望所有對話的最新1條消息進出用戶,例如, User2

ChatMsgs 
======== 
+--------+-----------+----------+-----------+ 
| ChatID | FKFromUID | FKToUID | Message | 
+--------+-----------+----------+-----------+ 
|  1 |   3 |  2 | Hello1 | 
|  2 |   2 |  1 | Hello2 | 
|  3 |   2 |  3 | Hello3 | 
|  4 |   3 |  2 | Hi1 | 
|  5 |   2 |  3 | Hi2 | 
|  6 |   3 |  2 | Hi3 | 
+--------+-----------+----------+-----------+ 

Users 
====== 
+--------+----------+ 
| UserID | Fullname | 
+--------+----------+ 
|  1 | User1 | 
|  2 | User2 | 
|  3 | User3 | 
+--------+----------+ 

我想要對以下結果按特定用戶進行過濾,例如,用戶2

+--------+----------+---------+ 
| UserID | Fullname | Message | 
+--------+----------+---------+ 
|  3 | User3 | Hi3  | 
|  1 | User1 | Hello2 | 
+--------+----------+---------+ 

正如你可以看到結果爲用戶2,但對於其他用戶,但只有這些記錄無論是在FKFromUID或FKToUID其中用戶2存在設置無信息/列。

下面是我創建的查詢,但如果用戶同時退出「發件人」和「收件人」,則會提供額外的記錄。

select U.UserID 
    , FullName 
    , Message 
    from ChatMsgs C 
    JOIN 
    (select max(ChatID) chatID 
     from ChatMsgs 
     group 
      by FKToUID 
     , FKFromUID 
    ) CC 
    ON C.ChatID = CC.ChatID 
    JOIN Users U 
    ON U.UID = C.FKFromUID 
where C.FKToUID = 2 
union 
select U.UserID, FullName, Message from ChatMsgs C JOIN (select max(ChatID) chatID from ChatMsgs group 
    by FKToUID, FKFromUID) CC ON C.ChatID=CC.ChatID JOIN Users U ON U.UID=C.FKToUID where C.FKFromUID=2 
+0

你嘗試過什麼?你有什麼麻煩? –

+1

請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查詢 – Strawberry

回答

0

如果我理解你的問題,你只需要選擇ChatMsgs要(例如FKToUID = 2),並與Users加入。

SELECT Users.UserID, Users.Fullname, ChatMsgs.Message 
    FROM ChatMsgs 
    INNER JOIN Users ON ChatMsgs.FKFromUID = Users.UserID 
WHERE ChatMsgs.FKToUID = 2 
+0

這將返回3條記錄。用戶只需要每次聊天的最新消息。請注意,3,2人在聊天,2,1人在聊天。 – xQbert

+0

我曾期待過這樣的事情,但我無法從預期結果中反向設計這一要求。 –

+0

您建議的查詢不提供所需的結果。 它要求其他用戶返回多行,而要求僅返回最後一行。 – user2702556

0

對於用戶2,你可以得到最大的ID爲相關聊天和與用戶

select User.UserID, Users.Fullname, t.Message 
    from ( 
    select case when FKFromUID = 2 then FKToUID else FKFromUID 
      END as UserID 
    from ChatMsgs 
    where id in (
    select max(id) 
    from ChatMsgs where FKFromUIDFromUID = 2 
    union 
    select max(id) 
    from ChatMsgs where FKToUID = 2 
    )) t 
    inner join users on t.UserID = Userse .UserID 
+0

此查詢未運行,它在第三行「作爲用戶ID」附近給出語法錯誤。 – user2702556

+0

答案已更新.. – scaisEdge

0

我一直在想必須有一個更簡單的方法加入...但是這似乎工作。

DEMO: http://rextester.com/MUMAVP47179

SELECT U.userID, U.FullName, Cm.Message 
FROM (SELECT MAX(Z.ChatID) chatID, UID 
     FROM (SELECT ChatID, case when FKFROMUID = 2 then FKTOUID else FKFROMUID end as UID 
      FROM ChatMsgs) Z 
     GROUP BY UID) Y 
INNER JOIN Users U 
on U.userID = Y.UID 
INNER JOIN ChatMsgs CM 
on Cm.ChatID = Y.ChatID 
ORDER BY Y.chatID desc;