我已经在我的网站上创建了一个基本的聊天程序,我想向聊天中显示的10个人中,首先是您最近与之通信的人。我一直无法看到正确的结果,并且我不能为此使用UNION。
所以我想做的是在user_id和收件人两列中查找,我既是邮件的收件人,还是发件人。这将产生一个我已经与之通信的用户列表。问题是我希望此user_id列表按msg_id DESCENDING或date
DESCENDING排序。但是,我尝试过的所有查询都是给我想要的user_id,但按user_id排序,或者正确排序但不提供DISTINCT user_id,因此它们将在我的聊天中多次列出。聊天栏基本上可以显示10个人,并且由于您的朋友数量可能比网站上的朋友多,因此我想向您显示您最近与之通信的用户,因为您发送聊天消息对您来说毫无意义,请关闭窗口,然后要向他们发送另一个消息,您必须导航回他们的个人资料才能打开聊天室。如果显示您最近发送或发送消息的联系人,我认为这10个快速好友缩略图效果最好。
CREATE TABLE `Outbox`
(`msg_id` `user_id`, `recipient`, `msg_body`, `date`);
INSERT INTO `Outbox`
(`msg_id` `user_id`, `recipient`, `msg_body`, `date`)
VALUES
(1, 100177, 22, `Hey buddy how are you?`, 1570319592),
(2, 100423, 22, `Want to go swimming today?`, 1580319895),
(3, 22, 100423, `Dinner is ready!`, 1510319492),
(4, 4117, 22, `Who are you calling a twerp?`, 1520319772);
SELECT users AS usr, MAX(msg_id)
FROM
( SELECT user_id AS users, msg_id
FROM outbox
WHERE recipient = 22
UNION DISTINCT
SELECT recipient AS users, msg_id
FROM outbox
WHERE user_id = 22
GROUP BY users )
AS t GROUP BY usr DESC
这是我在这里放弃并乞求帮助之前尝试的最后一个查询。
此查询似乎提供了正确的user_id,但是结果按实际的user_id排序,因此,如果您的第一个成员向您发送消息,即使您与他们聊天,它们也会显示在所有其他用户的下面最新的。
任何帮助或指针将不胜感激!我知道这里有几个类似的问题,但是我无法将任何类似的例子变成我自己的有效查询。谢谢
答案 0 :(得分:1)
因此,您希望每个聊天的用户仅显示一次?然后,您可以为每个用户获取最新消息:
RUN mkdir -p /usr/src/app
答案 1 :(得分:0)
SET @userId = 22;
SELECT
MAX(msg_id) AS last_msg_id,
IF (user_id = @userId, recipient, user_id) AS other_id
FROM Outbox
WHERE user_id = @userId OR recipient = @userId
GROUP BY other_id
ORDER BY last_msg_id
LIMIT 10;