MySQL选择发件人和收件人之间的最后一条对话消息

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

我希望查询一个表,通过发件人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 | +------------+-----------+--------------+--------------------------+---------------------+ 我整天绞尽脑汁想弄明白这一点,尝试各种子查询和分组,但都没有成功


有人能给我指一下正确的方向吗。

没有测试,但我想这是您根据预期结果所需要的

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进行一些测试之后,我注意到这个查询只起作用,没有两条消息同时发布。如果作者和收件人在完全相同的日期和时间发布邮件,则返回重复的行