我有一张表,其中所有会话都像这样存储
假设我有一个这样的表(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 |
-----------------------------------------
以及其他用户
答案 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