mysql选择groupby 2列

时间:2015-05-19 09:25:35

标签: mysql

的MySQL

表格消息


    | fromuser | toUser | message | time
    | 1        | 2      | Hi?     | +1
    | 2        | 1      | Hello!  | +2
    | 1        | 3      | There?  | +3
    | 3        | 1      | Yes     | +4
    | 2        | 3      | Hey     | +5
    | 3        | 2      | Sup?    | +6
    | 1        | 2      | :)      | +7
    | 1        | 4      | thanks  | 
    | 4        | 1      | welcome | 

我需要查询最新消息

我得到的最近的是

SELECT * FROM (SELECT * FROM Messages WHERE fromUser=1 OR toUser=1 ORDER BY time DESC) AS msg GROUP BY fromUser,toUser

结果:

| fromuser | toUser | message | time
| 2        | 1      | Hello!  | +2
| 1        | 3      | There?  | +3
| 3        | 1      | Yes     | +4
| 1        | 2      | :)      | +7
| 1        | 4      | thanks  | 
| 4        | 1      | welcome | 

它返回最新的和最新的。

我想要的是


    | fromuser | toUser | message | time
    | 3        | 1      | Yes     | +4
    | 1        | 2      | :)      | +7
    | 4        | 1      | welcome | 

来自user1的最新内容,就像聊天列表的工作方式一样。

1 个答案:

答案 0 :(得分:1)

OP正在寻找给定用户参与的每个对话的最新消息。

可能有一个更优雅的解决方案,但这是一种方式......

请注意,我的数据集有代理PK ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(fromuser INT NOT NULL
,toUser INT NOT NULL
,message VARCHAR(20) NOT NULL
,message_id INT NOT NULL PRIMARY KEY
);

INSERT INTO my_table VALUES
(1,2,'Hi?',1),
(2,1,'Hello!',2),
(1,3,'There?',3),
(3,1,'Yes',4),
(2,3,'Hey',5),
(3,2,'Sup?',6),
(1,2,':)',7),
(1,4,'thanks',8),
(4,1,'welcome',9);

SELECT a.* FROM my_table a
JOIN 
(
SELECT MAX(message_id) message_id FROM
(
SELECT toUser correspondent,message,message_id FROM my_table WHERE fromuser = 1
UNION
SELECT fromuser,message,message_id FROM my_table WHERE touser = 1
) x
GROUP BY correspondent
) b
ON b.message_id = a.message_id;

+----------+--------+---------+------------+
| fromuser | toUser | message | message_id |
+----------+--------+---------+------------+
|        1 |      2 | :)      |          7 |
|        3 |      1 | Yes     |          4 |
|        4 |      1 | welcome |          9 |
+----------+--------+---------+------------+