我正在进行facebook风格的聊天,并试图从一个用户那里获得与其他用户的所有最新对话。现在,我得到了所有的最新对话,但在情况下,另一个用户已经写信给我。我想要做的是,例如,我有两个对话,会话1是我最近写的,但现在我写到会话2,当我刷新页面会话2将是第一个。现在,如果会话1的另一个人写信给我,如果我刷新页面会话1将是第一个。这是我正在使用的两个表:
CREATE TABLE users (
id int(255) not null auto_increment,
username varchar(150) null,
email varchar(150) null,
password varchar(255) null,
salt varchar(255) null,
pic varchar(255) not null,
primary key(id)
) ENGINE = INNODB DEFAULT CHARSET=utf8;
CREATE TABLE chat (
id int(255) not null auto_increment,
id_us int(255) not null,
id_receptor int(255) not null,
message varchar(3000) not null,
chat_date datetime not null,
primary key (id),
index chatUsId(id_us),
index chatRecId(id_receptor),
foreign key (id_us) references users(id) on delete cascade,
foreign key (id_receptor) references users(id) on delete cascade
) ENGINE = INNODB DEFAULT CHARSET=utf8;
这是我使用的查询
SELECT m.id_us, m.id_receptor, u.username, u.pic
FROM users AS u, chat AS m
WHERE (m.id_us = u.id AND m.id_receptor =:id_us or m.id_receptor = u.id AND m.id_us =:id_us)
AND m.chat_date = (SELECT MAX( c.chat_date ) FROM chat AS c WHERE m.id_us = c.id_us AND m.id_receptor = c.id_receptor )
group by u.username
ORDER BY m.id DESC
在这种情况下,:id_us可能是1,我知道它不正确,因为它没有做我想要做的事情,但是我一直在努力寻找得到我想要的结果的方法,但是我被塞了下来,任何帮助都会被接受。为了更好地解释我自己,我想做的是,例如,当你在facebook聊天时,facebook消息列表可以查看你的最新对话。
发布于 2014-12-18 02:05:52
好的,这个怎么样:(对user1的id使用123 )
select T1.user2_id, users.username, users.pic, max(cdate) maxDate from
(select chat.id_receptor user2_id, max(chat_date) cdate
from chat
where chat.id_us=123
group by chat.id_receptor
union distinct
(select chat.id_us user2_id, max(chat_date) cdate
from chat where chat.id_receptor = 123
group by chat.id_us)) T1
inner join users on (users.id = T1.user2_id)
group by T1.user2_id
order by maxDate desc
发布于 2017-10-29 06:49:51
我希望最近的消息也像whatsapp一样,并且我已经根据我的表更新了您的查询。
select T1.user2_id, message, user_profile.user_name, user_profile.avatar, max(cdate) message_date from (select messages.receiver_id user2_id, messages.message, (message_date) cdate from messages where messages.sender_id=2 group by messages.receiver_id union distinct(select messages.sender_id user2_id, messages.message, max(message_date) cdate from messages where messages.receiver_id = 2 group by messages.sender_id)) T1 inner join user_profile on (user_profile.id = T1.user2_id) group by T1.user2_id order by message_date desc
发布于 2017-12-28 02:12:43
刚刚添加了另一个SELECT + JOIN。请参考下面的内容,如果有任何问题,请告诉我,我会尽力回答。
我想指出的是,尽管上面的答案是正确的,但据我理解,它没有满足所请求的查询的全部需要,因为它没有显示关键项目--即每次聊天的最后一条消息。
$sql="
SELECT T2.maxDate, T2.user2_id, T2.ava, T2.userName,chat.user_to,chat.user_from,chat.body,chat.viewed FROM (SELECT T1.user2_id, users.userName, users.ava, max(cdate) maxDate FROM
(SELECT chat.user_to user2_id, max(msg_time) cdate
FROM chat WHERE chat.user_from=18
GROUP BY chat.user_to
union distinct
(SELECT chat.user_from user2_id, max(msg_time) cdate
FROM chat WHERE chat.user_to=18
GROUP BY chat.user_from)) T1
inner join users on (users.userID = T1.user2_id)
group by T1.user2_id
order by maxDate desc) T2
join chat on (T2.maxDate = chat.msg_time) ORDER BY T2.maxDate DESC";
https://stackoverflow.com/questions/27537565
复制相似问题