加入两个mysql列,并在从第三列进行排序时显示不同的值

时间:2019-09-05 20:15:48

标签: mysql sorting distinct

我已经在我的网站上创建了一个基本的聊天程序,我想向聊天中显示的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排序,因此,如果您的第一个成员向您发送消息,即使您与他们聊天,它们也会显示在所有其他用户的下面最新的。

任何帮助或指针将不胜感激!我知道这里有几个类似的问题,但是我无法将任何类似的例子变成我自己的有效查询。谢谢

2 个答案:

答案 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;