簡體   English   中英

SQL:如何將兩個復雜查詢合並為一個,其中第二個需要來自第一個的數據

[英]SQL: How to merge two complex queries into one, where the second one needs data from the first one

目標是加載一個聊天列表,其中發送請求的用戶是其中的成員。一些聊天是群聊(超過兩個成員),我想在那里顯示寫最后三個用戶的個人資料圖片消息。

加載諸如標題和聊天時間戳等元數據的第一個查詢是:

SELECT Chat_Users.ID_Chat, Chats.title, Chats.lastMessageAt
FROM Chat_Users
    JOIN Chats ON Chats.ID = Chat_Users.ID_Chat
GROUP BY Chat_Users.ID_Chat
HAVING COUNT(Chat_Users.ID_Chat) = 2 
AND MAX(Chat_Users.ID_User = $userID) > 0
ORDER BY Chats.lastMessageAt DESC
LIMIT 20

從使用上述查詢加載的聊天之一加載最后三張個人資料圖片的查詢是:

SELECT GROUP_CONCAT(innerTable.profilePictures SEPARATOR ', ') AS 'ppUrls',     
        innerTable.ID_Chat 
FROM 
    (
    SELECT Chat_Users.ID_Chat, Users.profilePictureUrl AS profilePictures
    FROM Users
        JOIN Chat_Users ON Chat_Users.ID_User = Users.ID
        JOIN Chat_Messages ON Chat_Messages.ID_Chat = Chat_Users.ID_Chat
    WHERE Chat_Users.ID_Chat = $chatID
    ORDER BY Chat_Messages.timestamp DESC
    LIMIT 3
    ) innerTable
GROUP BY innerTable.ID_Chat

兩者都單獨工作,但我想將它們合並在一起,因此由於性能原因,我不必在循環中運行第二個查詢。 不幸的是,我不知道如何實現這一點,因為第二個查詢需要 $chatID,它只能從第一個查詢中獲得。

因此,為了澄清所需的結果:帶有個人資料圖片網址的列表(第二個查詢)應該只是第一個查詢結果中的另一列。

我希望以合理可理解的方式對其進行解釋。 任何幫助將非常感激。

編輯:受影響表中的示例數據:

表“聊天”: 在此處輸入圖像描述

表“Chat_Users”:

在此處輸入圖像描述

表“Chat_Messages”:

在此處輸入圖像描述

表“用戶”:

在此處輸入圖像描述

這滿足了簡要說明,但是它需要一個視圖,因為 MySQL 5.x 不支持WITH子句。

它又長又笨重,我試圖縮短它,但這已經是我能得到的最好的了,希望有人會在評論中彈出一個讓它更短的方法!

風景:

CREATE VIEW last_interaction AS
SELECT
    id_chat,
    id_user,
    MAX(timestamp) AS timestamp
FROM chat_messages
GROUP BY id_user, id_chat

查詢:

SELECT
    Chat_Users.ID_Chat,
    Chats.title,
    Chats.lastMessageAt,
    urls.pps AS profilePictureUrls
FROM Chat_Users
    JOIN Chats ON Chats.ID = Chat_Users.ID_Chat
    JOIN (
        SELECT
            lo.id_chat,
            GROUP_CONCAT(users.profilePictureUrl) AS pps
        FROM last_interaction lo
        JOIN users ON users.id = lo.id_user
        WHERE (
            SELECT COUNT(*) -- the amount of more recent interactions
            FROM last_interaction li
            WHERE (li.timestamp = lo.timestamp AND li.id_user > lo.id_user)
        ) < 3
        GROUP BY id_chat
    ) urls ON urls.id_chat = Chats.id
GROUP BY Chat_Users.ID_Chat
HAVING COUNT(Chat_Users.ID_Chat) > 2 
AND MAX(Chat_Users.ID_User = $userID)
ORDER BY Chats.lastMessageAt DESC
LIMIT 20

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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