MySQL, как решить отношение один-к-одному - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть реализация One-to-One Chat с MySQL. Цель - получить для одного пользователя все уникальные беседы с последним сообщением. Даже я использую MAX на первичном ключе и группирую по 2-му столбцу MySQL, отвергаю это.

Следующий запрос дает ошибку: Выражение № 2 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец «m.id», который функционально не зависит от столбцов в предложении GROUP BY;

Я использую MySQL версии 8.

Что мне здесь не хватает?

Таблица сообщений

id | member_a_id | member_a_status | member_b_id | member_b_status | conversation_id | content | created_dt

Таблица разговоров

id | member_a_id | member_a_status | member_b_id | member_b_status | conversation_id | content | created_dt | last_activity_dt

Запрос:

SELECT
  MAX(m.id) AS msgid, m.*
FROM
  message m
WHERE m.conversation_id IN
  (SELECT
    c.id
  FROM
    conversation c
  WHERE (
      c.member_a_id = 600
      AND c.member_a_status NOT IN (0, 3)
    )
    OR (
      c.member_b_id = 600
      AND c.member_b_status NOT IN (0, 3)
    ))
GROUP BY m.conversation_id
ORDER BY m.id DESC;

1 Ответ

0 голосов
/ 10 сентября 2018

Без примеров данных ваш вопрос немного сложен для понимания.Тем не менее, вы должны использовать оконные функции, если вы используете MySQL 8+.Запрос будет выглядеть примерно так:

SELECT cm.*
FROM (SELECT m.*,
             ROW_NUMBER() OVER (PARTITION BY m.conversation_id ORDE BY m.id DESC) as seqnum
      FROM message m JOIN
           conversion c
           ON m.conversation_id = c.conversation_id
      WHERE 600 IN (c.member_a_id, c.member_b_id) AND
            c.member_a_status NOT IN (0, 3)
     ) mc
WHERE seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...