Соединение влево Mysql с таблицей ссылок и ORDER и LIMIT - PullRequest
0 голосов
/ 05 марта 2020

Я разрабатываю функцию чата с таблицами cases, entries и attachments. Каждый чат (случай) имеет записи чата, которые имеют одно или несколько вложений. Вложения могут быть, например, текстовое сообщение или видео сообщение. Сейчас я пытаюсь представить последнее сообщение чата для определенного чата (случая) в обзоре чата - мне удается получить только последнее сообщение чата одного из разговоров чата (самое последнее).

ожидаемым результатом должен быть список текущих разговоров в чате с заголовком и последним сообщением, например:

чат службы поддержки

У меня есть решил проблему с помощью ...

Чата службы поддержки клиентов

Это просто, вам просто нужно восстановить ...

Упрощенная структура таблицы:

Шкафы

 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

Есть идеи, как заставить это работать?

1 Ответ

0 голосов
/ 05 марта 2020

Последний чат для каждого случая:

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
...