如何才能为我发送消息并接收消息的所有唯一用户

时间:2018-02-13 01:34:44

标签: mysql sql jpa jpql

我有一张表,其中所有会话都像这样存储

假设我有一个这样的表(fromUser和toUser是来自用户表的fk)

-----------------------------------------
Id.  |  FromUser  |  toUser  | message  |  
     |            |          |          |
1    |     1      |    2     |  Hi      |
2    |     2      |    1     |  hello   |  
3    |     3      |    1     |  hi      |
4    |     1      |    4     |  hello   |
-----------------------------------------

用户1订单的不同行的所需输出上次更新日期

-----------------------------------------
Id.  |  FromUser  |  toUser  | message  |  
     |            |          |          |
2    |     2      |    1     |  hello   |  
3    |     3      |    1     |  hi      |
4    |     1      |    4     |  hello   |
-----------------------------------------

用户2订单的不同行的所需输出上次日期

-----------------------------------------
Id.  |  FromUser  |  toUser  | message  |  
     |            |          |          |
2    |     2      |    1     |  hello   |  
-----------------------------------------

用户3订单的不同行的所需输出上次日期

-----------------------------------------
Id.  |  FromUser  |  toUser  | message  |  
     |            |          |          |
3    |     3      |    1     |  hi      |
-----------------------------------------

以及其他用户

1 个答案:

答案 0 :(得分:0)

我提出的查询有点复杂,所以这里有多个步骤:

1)获取与所请求用户匹配的消息的“其他用户”。

SET @id = 1;
SELECT id, FromUser, ToUser, updateDate,
       IF(FromUser=@id, ToUser, FromUser) as OtherUser
  FROM user_msgs 
  WHERE @id=FromUser OR @id=ToUser;

2)包装上面的内容并获取最后一次updateDate。 (请参阅下面的用户'id')

SET @id = 1;
SELECT OtherUser, max(updateDate) as updateDate FROM
   (
    SELECT id, FromUser, ToUser, updateDate,
          IF(FromUser=@id, ToUser, FromUser) as OtherUser
     FROM user_msgs 
     WHERE @id=FromUser OR @id=ToUser
   ) AS i1
 GROUP BY OtherUser;

3)完整查询 ...最后再次换行以获得所需的记录。

SET @id = 1;
SELECT * FROM user_msgs O
  WHERE EXISTS
  (
    SELECT * FROM 
     (
     
     SELECT OtherUser, min(updateDate) as updateDate FROM
       (
         
         SELECT id, FromUser, ToUser, updateDate,
              IF(FromUser=@id, ToUser, FromUser) as OtherUser
           FROM user_msgs 
           WHERE @id=FromUser OR @id=ToUser
    
        ) AS i1
       GROUP BY OtherUser
  
     ) i2
   WHERE O.updateDate = i2.updateDate AND
           (( O.FromUser=@id AND i2.OtherUser = O.ToUser) OR
            ( O.ToUser=@id AND i2.OtherUser = O.FromUser) )
  );

注意:如果你没有最后一个日期“updateDate”字段,而是使用“id”(我不确定),那么只需替换查询中的所有“updateDate”字段出现用“id”。

SQL小提琴:link