簡體   English   中英

MySQL 根據最近發送或接收的消息對消息進行排序

[英]MySQL ordering of messages based on the most recent message sent or received

我有三個表usersswipesmessages 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.

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