![](/img/trans.png)
[英]Combine the two queries into one that needs a value from second query in first
[英]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.