MySQL выбирает последнее сообщение разговора между отправителем и получателями - PullRequest
1 голос
/ 08 марта 2019

Я ищу запрос к таблице, чтобы получить последний диалог между отправителем и группой получателей по идентификатору отправителя или идентификатору получателя

У меня есть следующая таблица

CREATE TABLE `messages` ( 
`message_id` Int( 11 ) AUTO_INCREMENT NOT NULL,
`author_id` Int( 11 ) NOT NULL,
`recipient_id` Int( 11 ) NOT NULL DEFAULT 0,
`message` Text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`date_created` Timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`date_updated` Timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`recipient_read` Int( 11 ) NOT NULL DEFAULT 0,
`attachment` VarChar( 64 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
PRIMARY KEY ( `message_id` ),
CONSTRAINT `message_id` UNIQUE( `message_id` ) )
CHARACTER SET = utf8
COLLATE = utf8_general_ci
ENGINE = InnoDB;

Пример данных:

+------------+-----------+--------------+---------------------------+---------------------+
| message_id | author_id | recipient_id |          message          |    date_created     |
+------------+-----------+--------------+---------------------------+---------------------+
|          1 |         1 |          101 | Hey buddy, what's up!     | 2019-03-08 11:11:07 |
|          2 |         1 |          101 | Hope all is well? :)      | 2019-03-08 11:11:30 |
|          3 |       101 |            1 | Yes, all good thanks      | 2019-03-08 11:25:04 |
|          4 |       101 |            1 | Super busy right now..    | 2019-03-08 11:25:16 |
|          5 |         1 |          101 | Same old stuff everyday.  | 2019-03-08 11:26:45 |
|          6 |         1 |          101 | Yea I guess so! but lis.. | 2019-03-08 11:27:26 |
|          7 |         1 |          100 | Hey man! hit me up, i've  | 2019-03-08 15:43:27 |
|          8 |         5 |          101 | Hola! come sta            | 2019-03-08 15:48:13 |
|         10 |         1 |           99 | Niky nejez sam            | 2019-03-08 16:06:18 |
|         11 |       101 |            1 | Last message!             | 2019-03-08 17:18:44 |
+------------+-----------+--------------+---------------------------+---------------------+

Я ищу запрос последнего сообщения для определенного идентификатора пользователя, и в результате должно быть возвращено последнее сообщение, отправленное или полученное для этого пользователя, для всех пользователей, с которыми он / она разговаривал.

Например, запрос для идентификатора пользователя 1 должен вернуть следующее:

+------------+-----------+--------------+--------------------------+---------------------+
| message_id | author_id | recipient_id |         message          |    date_created     |
+------------+-----------+--------------+--------------------------+---------------------+
|          7 |         1 |          100 | Hey man! hit me up, i've | 2019-03-08 15:43:27 |
|         10 |         1 |           99 | Niky nejez sam           | 2019-03-08 16:06:18 |
|         11 |       101 |            1 | Last message!            | 2019-03-08 17:18:44 |
+------------+-----------+--------------+--------------------------+---------------------+

Я целый день ломал голову, пытаясь понять это и опробовать всевозможные подсистемы.запросы и группировать, но безуспешно.

Может кто-нибудь указать мне в правильном направлении, пожалуйста.

Ответы [ 4 ]

1 голос
/ 08 марта 2019

Вы можете попробовать использовать подзапрос для связанных авторов группы конвенций по максимальной дате

SELECT  m.* 
FROM  messages m
INNER JOIN  (
    SELECT IF(author_id <= recipient_id, CONCAT(author_id,'_', recipient_id) ,CONCAT(recipient_id,'_', author_id) ) COUPLE, 
    MAX(date_created) max_date 
    FROM  messages
    GROUP BY COUPLE 
) t ON IF(m.author_id <= m.recipient_id,
         CONCAT(m.author_id,'_', m.recipient_id),
         CONCAT(m.recipient_id,'_', m.author_id) )  = t.COUPLE 
AND t.max_date  = m.date_created
0 голосов
/ 09 марта 2019

Попробуйте:

    SELECT * FROM messages A LEFT JOIN
    (SELECT author_id,recipient_id,MAX(date_created) AS "DC" 
    FROM messages 
    GROUP BY author_id,recipient_id) B 
    ON A.author_id=B.author_id 
    AND A.recipient_id=B.recipient_id 
    AND A.date_created=B.DC 
    LEFT JOIN
    (SELECT author_id,recipient_id,MAX(date_updated) AS "DU" 
    FROM messages 
    GROUP BY author_id,recipient_id) C 
    ON A.author_id=C.author_id 
    AND A.recipient_id=C.recipient_id 
    AND A.date_updated=C.DU;

Я специально ввел SELECT * FROM в начале, чтобы он отображал все столбцы из таблицы messages A и подзапросы B & C (в основном все они являются messages Таблица).Это позволит вам выбрать столбец из таблицы и / или подзапросов.Надеюсь, это поможет

0 голосов
/ 08 марта 2019

Я думаю, что вам нужно UNION и GROUP BY для каждого SELECT, чтобы получить author_id ,recipient_id и data_updated, которые вы ищете, а затем INNER JOIN между созданным подзапросом и messages таблица для получения других данных:

SELECT  message_id
       ,author_id
       ,recipient_id
       ,message
       ,data_created
       ,data_updated
FROM   messages M
INNER JOIN
    (SELECT DISTINCT 
            author_id
           ,recipient_id
           ,MAX(date_updated) AS data_updated
    FROM    messages
    GROUP BY author_id
            ,recipient_id
    WHERE author_id = 'YOUR_USER_ID'
    UNION
    SELECT DISTINCT 
            author_id
           ,recipient_id
           ,MAX(date_updated) AS data_updated
    FROM    messages
    GROUP BY author_id
            ,recipient_id
    WHERE recipient_id = 'YOUR_USER_ID') A
ON  M.author_id = A.author_id 
AND M.recipient_id = A.recipient_id
AND M.data_updated = A.data_updated
0 голосов
/ 08 марта 2019

Не проверено, но я думаю, что это то, что вам нужно, согласно ожидаемому результату.

SELECT * FROM
 (SELECT * FROM messages WHERE (author_id = 1 OR recipient_id = 1) ORDER BY 
 date_updated DESC) 
ORDER BY message_id ASC LIMIT 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...