[英]Select last message between a sender and a receiver in SQL
我目前正在嘗試獲取數據庫中的最后一條消息,以便與其他消息系統(如 Facebook Messenger 或 WhatsApp)建立類似的系統,但我想通過發件人 ID(id_emmeteur_id)獲取“對話”的最后一條消息) 和接收者 ID (id_destinataire_id)。
問題是我只成功獲取了所有消息,並且我想根據連接的用戶只獲取兩個用戶之間的最后一條消息(連接的一個和另一個,取決於我在我的消息表)。
我已經將我的“消息”表結構放在下面,並附有一些示例,希望對您有所幫助。
id|id_emmeteur_id|id_destinataire_id|contenu
--------------------------------------------
1| 3| 1|test
2| 3| 1|another test
3| 1| 3|test number 3
4| 1| 2|another user
通過這些示例,從邏輯上講,我應該得到(如果連接的用戶的 ID 為“1”)消息“測試號 3”和“另一個用戶”,因為 ID 為“1”和 ID 為“3”的用戶之間的最后一條消息是“測試號 3”,因為“另一個用戶”是 ID 為“1”和 ID 為“2”的用戶之間的唯一消息,但我認為我的查詢不正確。 我還將把我找到的查詢放在它可以幫助你的情況下。
select *
from message
where id_destinataire_id=3
or id_emmeteur_id=1
AND ( id, least(id_emmeteur_id, id_destinataire_id), greatest(id_emmeteur_id, id_destinataire_id))
in
( select
max(id)
, least(id_emmeteur_id, id_destinataire_id)
, greatest(id_emmeteur_id, id_destinataire_id)
from message
group by id_emmeteur_id, id_destinataire_id
)
在此先感謝您的幫助。 (我希望我的數據庫結構不正確)
你可以使用not exists
如下:
select t.*
from your_table t
where 1 in (t.id_emmeteur_id, t.id_destinataire_id)
and not exists
(select * from your_table tt
where t.id_emmeteur_id = tt.id_emmeteur_id
and t.id_destinataire_id = tt.id_destinataire_id)
and tt.id > t.id)
一種方法是通過往返 id 獲取最后一次對話,並基於此過濾結果。
WITH LastMessages AS
(
SELECT
id,
ROW_NUMBER()OVER(PARTITION BY id_destinataire_id ORDER BY ID) last_destinataire_id,
ROW_NUMBER()OVER(PARTITION BY id_emmeteur_id ORDER BY ID) last_emmeteur_id,
id_destinataire_id to_id,
id_emmeteur_id from_id
contenu
FROM
message
WHERE
id_emmeteur_id = 3 OR id_destinataire_id = 3
)
SELECT
id, to_id, from_id, contenu
FROM
LastMessages
WHERE
last_destinataire_id = 1 OR last_emmeteur_id = 1
ORDER BY
id;
無 CTE 版本
SELECT
id,
to_id,
from_id,
contenu
FROM
(
SELECT
id,
last_destinataire_id = ROW_NUMBER()OVER(PARTITION BY id_destinataire_id ORDER BY ID),
last_emmeteur_id = ROW_NUMBER()OVER(PARTITION BY id_emmeteur_id ORDER BY ID),
to_id = id_destinataire_id,
from_id = id_emmeteur_id,
contenu
FROM
message
WHERE
id_emmeteur_id = 3 OR id_destinataire_id = 3
)AS X
WHERE
last_destinataire_id = 1 OR last_emmeteur_id = 1
ORDER BY
id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.