[英]Left joining Mysql with link table and ORDER and LIMIT
我正在開發具有表格cases
、 entries
和attachments
的聊天功能。 每個聊天(案例)都有包含一個或多個附件的聊天條目。 附件可以是例如文本消息或視頻消息。 現在我正在努力在聊天概述中顯示特定聊天(案例)的最后一條聊天消息 - 我只能設法獲得其中一個聊天對話(最新一個)的最后一條聊天消息。
預期結果應該是帶有標題和最后一條聊天消息的正在進行的聊天對話列表,例如:
IT 支持聊天
我已經解決了這個問題...
客服聊天
很簡單,你只需要重新...
簡化表結構:
案例
id | title
-----|-----------------
1 | IT-support chat
參賽作品
id | case_id | time_created
-----|--------------|--------------
15 | 1 | ...
16 | 1 | ...
附件
id | entry_id | payload
-----|--------------|--------------------------------------------
1 | 15 | Who solved the issue?
2 | 16 | I have solved the issue with the meatballs
此查詢僅選擇其中一個案例的最后一條聊天消息,而不是每個案例的最后一條聊天消息:
SELECT
cases.title AS caseTitle,
last_chatmsg.payload AS lastChatMsg
FROM
cases
LEFT JOIN (
SELECT
entries.case_id,
attachments.payload
FROM
entries, attachments
WHERE
entries.id = attachments.entry_id
ORDER BY
entries.time_created DESC
LIMIT 1
)
last_chatmsg ON last_chatmsg.case_id = cases.id
GROUP BY cases.id
有關如何使其工作的任何想法?
每個案例的最新聊天記錄:
SELECT x.case_id, x.id FROM
(SELECT case_id, id, ROW_NUMBER(OVER PARTITION BY case_id ORDER BY time_created DESC) rn FROM entries)
WHERE x.rn = 1
將其轉換為 CTE:
WITH mrc AS
SELECT x.case_id, x.id FROM
(SELECT case_id, id, ROW_NUMBER(OVER PARTITION BY case_id ORDER BY time_created DESC) rn FROM entries)
WHERE x.rn = 1
SELECT * FROM
cases c
INNER JOIN mrc m ON c.id = m.case_id
LEFT JOIN attachments a ON mrc.id = a.entry_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.