簡體   English   中英

Select SQL 中發送者和接收者之間的最后一條消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM