一、需求:
在展示聊天首页面时,需满足以下条件:
A与B聊天,A既可以是发送者,也可以是接收者;B同样可以为发送者或接受者。
(1)去重复:若A与B聊天,对A→B,或B→A只显示一条;
(2)聊天内容的排序:A与B聊天,显示最新一条聊天内容;
(3)对所获取的聊天集合按时间倒叙排列。
如:最终所需展示内容如下
数据库数据如下:
二、获取所需数据
(1)方案一,使用sql直接查询:
SELECT * FROM messages mes WHERE NOT EXISTS ( SELECT * FROM messages WHERE mes.id < id AND ((mes.mfrom = mfrom AND mes.mto = mto) OR
( mes.mfrom = mto AND mes.mto = mfrom )))AND (mes.mfrom = '4d5e6acb7efa4b67826cfff440b3d12c ' OR mes.mto = '4d5e6acb7efa4b67826cfff440b3d12c ')
ORDER BY mcreated_time DESC;
注:因为id为自增字段主键,所以对id排序即对时间排序,解决了时间相同问题;A—B与B—A为同一聊天对象。
(2)方案二,使用sql+java代码实现:
sql语句为:
SELECT * FROM messages mes WHERE NOT EXISTS (SELECT * FROM messages WHERE mes.mfrom=mfrom AND mes.`id` < id )
AND (mes.mfrom = '4d5e6acb7efa4b67826cfff440b3d12c ' OR mes.mto = '4d5e6acb7efa4b67826cfff440b3d12c ') ORDER BY mes.mcreated_time DESC;
因为只按照mfrom去重,聊天双方都可是mfrom,也可是mto,所以还存在重复,需进一步去重,可用java代码实现:
public List<Messages> findMessagesByDistinctAndCreateTimeDescByMemberId(String memberId) {
List<Messages> messagesList = messageRepository.findMessagesByDistinctAndCreateTimeDescByMemberId(memberId);
for (int i = 0; i < messagesList.size(); i++) {
Messages messages = messagesList.get(i);
String messagesForm = messages.getMessagesForm();
String messagesTo = messages.getMessagesTo();
for (int j = 0; j < messagesList.size(); j++) {
Messages messages2 = messagesList.get(j);
String messagesForm2 = messages2.getMessagesForm();
String messagesTo2 = messages.getMessagesTo();
if (messagesForm.equals(messagesTo2) && messagesTo.equals(messagesForm2)) {
if(messages.getId()<messages2.getId()) {
messagesList.remove(messages);
}
}
}
}
return messagesList;
}
注:核心为从list集合中去除满足条件的重复数据。