[英]MySQL ordering of messages based on the most recent message sent or received
我有三個表users
、 swipes
和messages
。 users
包含注冊用戶的詳細信息。 swipes
包含已連接用戶的列表(發送/接受好友請求)。 messages
包含連接用戶之間交易的消息。
有了這些,我正在構建一個基於 Web 的線程聊天應用程序,例如 facebook 或 whatsapp。 我目前能夠列出所有可用於聊天的已連接用戶。 但是,我無法使用最近發送或接收的消息來訂購它們。 與最近的消息(發送/接收)進行交易的用戶應顯示在列表頂部。
示例表: users
id name
1 John
2 Mary
3 David
示例表: swipes
(在這里,您可以看到 John 與 Mary 和 David 都有關聯)
id swp_from swp_to first_swp second_swp
1 1 2 like like
2 3 1 like like
示例表: messages
(這里incoming_msg_id
是發送者的用戶id, outgoing_msg_id
是接收者的用戶id)
id incoming_msg_id outgoing_msg_id msg
1 1 2 Hi, Mary
2 1 3 Hey, David
生成我選擇與之聊天的已連接用戶列表的當前查詢:
SELECT * FROM users WHERE
(id IN (SELECT swp_from FROM swipes WHERE swp_to = :user AND (first_swp = 'like' OR first_swp = 'superlike') AND (second_swp = 'like' OR second_swp = 'superlike')) OR
id IN (SELECT swp_to FROM swipes WHERE swp_from = :user AND (first_swp = 'like' OR first_swp = 'superlike') AND (second_swp = 'like' OR second_swp = 'superlike')))
然后我使用 PHP while 循環來顯示來自上述查詢的記錄。 但是,這不會按預期對列表進行排序。 我想根據消息對它們進行排序,以便將最近處理消息的用戶線程發送到頂部。 舉個例子,大衛在第三位,但突然我打開他的聊天給他發了一條新消息(或者我收到了他身邊的消息),他的帖子會被推到列表的頂部(就像facebook一樣信使或whatsapp)。 我嘗試了很多,但我所有的加入都是一場災難。 我無法正確構建查詢。
更新
我嘗試了以下查詢。 這可以讓我了解我想要實現的目標。 但是,這不起作用。
SELECT * FROM users WHERE
(id IN (SELECT swp_from FROM swipes WHERE swp_to = :user AND (first_swp = 'like' OR first_swp = 'superlike') AND (second_swp = 'like' OR second_swp = 'superlike')) OR
id IN (SELECT swp_to FROM swipes WHERE swp_from = :user AND (first_swp = 'like' OR first_swp = 'superlike') AND (second_swp = 'like' OR second_swp = 'superlike')))
ORDER BY (SELECT MAX(id) FROM messages WHERE incoming_msg_id = :user OR outgoing_msg_id = :user) DESC
更新 2
SELECT * FROM
(SELECT swp_to uid FROM swipes WHERE swp_from = :user AND first_swp IN ('like','superlike') AND second_swp IN ('like','superlike')
UNION
SELECT swp_from uid FROM swipes WHERE swp_to = :user AND first_swp IN ('like','superlike') AND second_swp IN ('like','superlike')) u
JOIN messages m ON u.uid IN (m.incoming_msg_id, m.outgoing_msg_id)
JOIN users usr ON u.uid = usr.id
GROUP BY u.uid ORDER BY MAX(m.id) DESC
嘗試
SELECT u.uid, max(m.id) lastmsg
FROM
(
-- rephrased your query to get distinct user ids of interest
SELECT swp_to uid
FROM swipes
WHERE swp_from = :user AND first_swp IN ('like','superlike') AND second_swp IN ('like','superlike')
UNION
SELECT swp_from uid
FROM swipes
WHERE swp_to = :user AND first_swp IN ('like','superlike') AND second_swp IN ('like','superlike')
) u
JOIN messages m
ON u.uid in (m.incoming_msg_id, m.outgoing_msg_id)
GROUP BY u.uid
ORDER BY max(m.id) DESC
可以通過額外加入來添加用戶信息
with maxid as (
SELECT u.uid, max(m.id) lastmsg
FROM (
SELECT swp_to uid
FROM swipes
WHERE swp_from = 1 AND first_swp IN ('like','superlike') AND second_swp IN ('like','superlike')
UNION
SELECT swp_from uid
FROM swipes
WHERE swp_to = 1 AND first_swp IN ('like','superlike') AND second_swp IN ('like','superlike')
) u
JOIN messages m
ON u.uid in (m.incoming_msg_id, m.outgoing_msg_id)
GROUP BY u.uid
)
SELECT u.*, lastmsg
FROM maxid
JOIN users u on maxid.uid= u.id
ORDER BY lastmsg DESC
因此,首先創建一個統一的 swp_frm 記錄和 swp_to 記錄的統一集。 然后將該結果嵌入到匯總查詢中以獲取每個用戶的一行。
Select userid, username From (
Select u.id as userid, u.name as username
From swipes s Inner Join users u on s.swp_frm=u.id
Where s.swp_to = :user And (first_swp in ('like','superlike') Or second_swp in ('like','superlike'))
Group By u.id, u.name
UNION
Select u.id as userid, u.name as username
From swipes s Inner Join users u on s.swp_to=u.id
Where s.swp_frm = :user And (first_swp in ('like','superlike') Or second_swp in ('like','superlike'))
Group By u.id, u.name
) X Left Outer Join messages m On X.userid in (m.incoming_msg_id, m.outgoing_msg_id)
Group By userid, username
Order by max(m.id) desc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.