MySQL选择发件人和收件人之间的最后一条对话消息
我希望查询一个表,通过发件人id或收件人id获取发件人和收件人组之间的最后一次对话 我有下表MySQL选择发件人和收件人之间的最后一条对话消息,mysql,join,subquery,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_gene
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 |
+------------+-----------+--------------+--------------------------+---------------------+
我整天绞尽脑汁想弄明白这一点,尝试各种子查询和分组,但都没有成功
有人能给我指一下正确的方向吗。没有测试,但我想这是您根据预期结果所需要的
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
您可以尝试使用子查询来查询convdrsation group by max date的耦合自动记录
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
我认为您需要在每次选择时使用UNION and和GROUP BY来获取要查找的作者id、收件人id和更新的数据,然后在创建的子查询和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
试试这个:
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表。这将允许您自定义表和/或子查询中的哪一列。希望这有助于查看您是否可以在不包含一张图片的情况下提出相同的问题。此外,收件人读取的值存储了什么?请阅读此内容@草莓谢谢你的小费。我会用正确的格式更新问题是的,不应该有任何限制,所有对话都应该被选择Hanks a lot@scaisEdge,这个查询返回了我所期望的结果。不过,查询中有一些输入错误。在对@scaisEdge进行一些测试之后,我注意到这个查询只起作用,没有两条消息同时发布。如果作者和收件人在完全相同的日期和时间发布邮件,则返回重复的行