MySQL选择发件人和收件人之间的最后一次转换消息

标签 mysql join subquery

我希望通过发件人 ID 或收件人 ID 查询表以获取发件人和收件人组之间的最后一次对话

我有下表

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

我要查询的是特定用户 ID 的最后一条消息,结果应返回与他/她交谈过的所有用户为该用户发送或接收的最后一条消息。

例如,用户 ID 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 |
+------------+-----------+--------------+--------------------------+---------------------+

我整天都在绞尽脑汁想弄清楚这个问题,并尝试了各种子查询和分组,但没有任何成功。

谁能指出我正确的方向。

最佳答案

您可以尝试根据最大日期对 session 组的耦合作者使用子查询

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

关于MySQL选择发件人和收件人之间的最后一次转换消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55067340/

相关文章:

sql - 如何按组输出两列中的每个值组合? - SQL

php - CDbCriteria 只返回一个表数据而不是来自连接的数据

mysql - 我有两个表,其中包含与 UserID 相同的列。如何通过子查询获取所有行

php - MySQL 几个内部连接与子查询

MySQL 抛出 "Operating system error number 22"——这是怎么回事?

php - 通过用户名在 Laravel 中查找用户

php - 加入 Laravel 5.1

mysql - 访问被拒绝错误,而我应该拥有 pythonanywhere.com 的所有权限

PHP/SQL 脚本意外停止,在调试中工作

php - 子查询 ActiveRecord Yii