如何使用MySQL GROUP BY选择唯一值

时间:2016-08-30 17:07:52

标签: mysql sql

我在用户之间有一个充满消息的表,我想从userFrom不是我的用户的每个用户中选择最后一条消息(4),但是如果给另一个用户的最后一条消息(userTo)是最后一条消息在我的用户(4)和另一个用户之间,那应该是返回记录中该消息的值。

TABLE消息

id|userFrom|userTo|msg
-------------------------
1 |  4     | 9    |msg 1    
2 |  9     | 4    |msg 2    
3 |  4     | 63   |msg 1    
4 |  63    | 4    |msg 2    
5 |  4     | 9    |msg 3    
6 |  9     | 4    |msg 4    
7 |  9     | 4    |msg 5
8 |  63    | 4    |msg 3

我的最终目标是使用数据显示来自唯一用户的消息列表,其中每行是不同的用户,它显示我的用户和该用户之间的最后一条消息(用于视觉参考我正在尝试创建一些内容)喜欢Facebook消息)

我希望上面的表数据如何返回

id|userFrom|msg
-------------------------
7 |  9     |msg 5    
8 |  63    |msg 3

我需要userFrom是唯一的,所以我可以扩展查询以进行额外的连接,从user表获取用户表中的实际varchar用户名,其中userFrom是某个用户而不是我自己的用户。

4 个答案:

答案 0 :(得分:1)

以下是leastgreatest的一个选项:

select id, userfrom, userto, msg
from messages m join (
  select max(id) maxid
  from messages
  group by  least(userfrom, userto), greatest(userfrom, userto)
  ) t on m.id = t.maxid

BTW - 我认为您的预期结果不正确。您的示例数据中没有id = 8

答案 1 :(得分:1)

试试这个:

SELECT messages.id, messages.userFrom, messages.msg
FROM messages INNER JOIN
(SELECT userFrom, max(id) AS mxid
FROM messages
GROUP BY userFrom) sub
ON messages.id = sub.mxid
WHERE messages.UserFrom <> 4

答案 2 :(得分:0)

我认为这就是你要找的东西

CREATE TABLE [dbo].[UserMessage](
    [id] [int] NOT NULL,
    [userFrom] [int] NOT NULL,
    [userTo] [int] NOT NULL,
    [msg] [varchar](50) NOT NULL
) ON [PRIMARY]

insert into UserMessage values(1,4,9,'msg 1')
insert into UserMessage values(2,9,4,'msg 2')
insert into UserMessage values(3,4,63,'msg 1')
insert into UserMessage values(4,63,4,'msg 2')
insert into UserMessage values(5,4,9,'msg 3')
insert into UserMessage values(6,9,4,'msg 4')
insert into UserMessage values(7,9,4,'msg 5')
insert into UserMessage values(8,63,4,'msg 3')

SELECT lastMesageFrom.*, um.msg
FROM
(
select max(id) as id,UserFrom from UserMessage
where UserTo = 4 
Group by UserFrom
)as lastMesageFrom
Left Outer join UserMessage um on um.id = lastMesageFrom.id

the code in this other answer

编辑:已通过MySQL验证:enter image description here

答案 3 :(得分:-1)

您必须阅读where和having子句之间的区别。

首先,通过WHERE子句过滤您的记录(其中userFrom!= 4) 然后使用group by 最后过滤HAVING子句(具有userTo = 4)

发送给您的消息