按最后发送的消息对用户分组

Posted

技术标签:

【中文标题】按最后发送的消息对用户分组【英文标题】:group users by message last sent 【发布时间】:2014-02-16 12:06:42 【问题描述】:

我有一个表格,其中包含从 1 个用户发送给另一个用户的消息。我想知道从不同用户发送或接收的所有消息都不相同。例如:1-2 与 2-1 相同,但由于 2 已与用户进行了最后一次联系,因此该消息将显示在顶部,并且还会显示向我发送或接收消息的用户不是我自己。ALso 检查是否有任何消息是从同一用户发送的,例如 1-1。我也需要获取名称。非常感谢任何帮助。在此先感谢。

代码

CREATE TABLE if not exists tblA
(
id int(11) NOT NULL auto_increment ,
sender varchar(255),
receiver varchar(255),
 msg varchar(255),
 date timestamp,
 PRIMARY KEY (id)
);

CREATE TABLE if not exists tblB
(
id int(11) NOT NULL auto_increment ,
sno varchar(255),
name varchar(255),
 PRIMARY KEY (id)
);


INSERT INTO tblA (sender, receiver,msg,date ) VALUES
('1', '2', 'buzz ...','2011-08-21 14:11:09'),
('1', '2', 'test ...','2011-08-21 14:12:19'),
('1', '2', 'check ...','2011-08-21 14:13:29'),
('1', '1', 'test2 ...','2011-08-21 14:14:09'),
('2', '1', 'check2 ...','2011-08-21 14:15:09'),
('2', '1', 'test3 ...','2011-08-21 14:16:09'),
('1', '2', 'buzz ...','2011-08-21 14:17:09'),
('1', '2', 'test ...','2011-08-21 14:18:19'),
('1', '2', 'check ...','2011-08-21 14:19:29'),
('1', '1', 'test2 ...','2011-08-21 14:10:09'),
('3', '1', 'check2 ...','2011-08-21 14:21:09'),
('3', '1', 'test3 ...','2011-08-21 14:22:09'),
('3', '2', 'buzz ...','2011-08-21 14:24:09'),
('3', '2', 'test ...','2011-08-21 14:25:19'),
('1', '3', 'check ...','2011-08-21 14:26:29'),
('1', '3', 'test2 ...','2011-08-21 14:27:09'),
('2', '3', 'check2 ...','2011-08-21 14:28:09'),
('2', '3', 'test3 ...','2011-08-21 14:29:09'),
('1', '2', 'check3 ...','2011-08-21 14:23:09');


INSERT INTO tblB (sno, name ) VALUES
('1', 'Aa'),
('2', 'Bb'),
('3', 'Cc');

我正在查看 SMS 收件箱消息的行,其中数据传入/发送给不同的用户,并显示该名称以及最后发送的消息。我如何对其进行分组?

像这样:

http://jesperbylund.com/wp-content/uploads//2011/11/Facebook-Messenger-459x900.png


我想要按日期排序的 Aa 正在与之交谈的人员列表。

Bb
Cc

除了 Aa 之外的一切,因为他是用户。

【问题讨论】:

请将所有相关信息直接添加到您的问题中。特别是 SQLFiddle 有时会出现故障,我们希望为未来的访问者保留帖子。 期望的结果集是什么样的? 这几行sqlfiddle.com/#!2/19ea8/45 喜欢这个jesperbylund.com/wp-content/uploads//2011/11/… 只需将所需的结果集粘贴到问题中即可。 【参考方案1】:

我不确定你想要什么,但试试这个:

SELECT t1.sender, t1.receiver, MAX(t1.date)
FROM tblA t1
INNER JOIN (SELECT * FROM tblA ) t2 ON t1.sender = t2.sender 
                                    AND t1.receiver = t2.receiver 
                                    AND t1.sender <> t2.receiver
 GROUP BY t1.sender, t1.receiver

【讨论】:

【参考方案2】:

我不明白您到底需要什么,但您需要使用 LEFT JOIN 来获取名称。

是这样的

SELECT a.msg AS message, b.name AS sender, c.name AS receiver, date FROM tblA a
LEFT JOIN tblB b ON b.sno = a.sender
LEFT JOIN tblB c ON c.sno = a.receiver
WHERE a.sender != a.receiver
ORDER BY date DESC

【讨论】:

以上是关于按最后发送的消息对用户分组的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 按最后一条消息对对话进行排序

如何找到特定用户 discordjs 的最后发送消息

如何获取某个用户发送的最后 1000 条消息?

当用户不在聊天中时如何显示发送的最后一条消息?

DiscordJS 13用户嵌入显示在特定频道发送的最后一条消息

SQL 连接 3 个按最新组值分组的表