MySql SQL查询分组依据和排序依据

时间:2014-11-22 18:44:24

标签: php mysql sql

我在mysql中有一个表。结构是:

id   sender   receiver        time              message
-------------------------------------------------------
1     23         34      2014-11-02 14:55:02      1
2     22         34      2014-11-02 16:55:02      2
3     21         35      2014-11-02 16:55:02      5
4     23         34      2014-11-02 16:55:02      2
5     22         35      2014-11-02 16:55:02      1

现在我需要进行一个查询,如果通信不止一个,将从特定发送者获取特定接收者的最新消息。否则它将给出单行。这里我想用接收器id = 34进行查询,它应该给我第4行和第2行。即。

2     22         34      2014-11-02 16:55:02      2
4     23         34      2014-11-02 16:55:02      2

这里我不是要求数据库中的特定行数。这是一个对话数据库。我想要一个用户的对话列表。当同一个发送者和接收者有多行时,我想要最新的对话。

怎么做?

2 个答案:

答案 0 :(得分:1)

您可以使用group by获取最新的消息时间,然后在子查询中使用它来获取所有消息详细信息

 Select * from
 table1 T
 Join(
      Select sender ,max(time) as lastTime
      From table1
      Where receiver = 34
     Group by sender) T2
 On T.sender = T2.sender
 and T.time = T2.lastTime 
 And T.receiver = 34

答案 1 :(得分:1)

有很多方法可以实现它,一种方法是使用左连接然后使用连接条件组数据,最后使用附加条件进一步过滤

select
m.* from messages m
left join messages m1 on m1.receiver = m.receiver
and m.id < m1.id
and m.sender = m1.sender
where m1.id is null
and m.receiver = 34;

其他方式是使用exists作为group by

的替代方法
select m.* from messages m
where not exists
(
  select 1 from messages m1
  where
  m1.receiver = m.receiver
  and m.id < m1.id
  and m.sender = m1.sender
)
and m.receiver = 34;

<强> demo