使用GROUP BY和ORDER BY Together来检索最新消息

时间:2014-11-22 08:20:47

标签: mysql

我'我正在建立一个消息传递系统,我需要按发件人对消息进行分组,然后按降序排序,以便最新消息始终位于最前面。

查询

SELECT 
    messages.message_id, 
    messages.message_from, 
    messages.message_to, 
    messages.message_content, 
    messages.message_seen, 
    messages.message_datetime, 
    messages.message_status, 
    profiles.profile_id, 
    profiles.profile_photo, 
    profiles.profile_username, 
    profiles.profile_name 
FROM 
    messages 
INNER JOIN 
    PROFILES 
WHERE 
    profiles.profile_id = messages.message_from
GROUP BY 
    messages.message_from
ORDER BY 
    messages.message_id DESC

以上查询显示的内容。

enter image description here

这就是数据库结构的样子 enter image description here

如您所见, message_id 按降序排列,但不是最新的ID。

问题:

如何使用Group By和Order By一起显示上面数据库查询中来自数据库的最新消息,我缺少什么?

3 个答案:

答案 0 :(得分:3)

这是你如何做到的,如下所示,我没有选择你可以添加选择列表中所需字段的所有字段

select 
m.message_id,
m.message_from,
m.message_to,
p.profile_name
from messages m
join profiles p on p.profile_id = m.message_from
left join messages m1 
on m1.message_from = m.message_from
and m.message_id < m1.message_id
where 
m1.message_id is null
order by m.message_id desc

另一种做法是

select 
m.message_id,
m.message_from,
m.message_to,
p.profile_name
from messages m
join profiles p on p.profile_id = m.message_from
where not exists
(
  select 1 from messages m1
  where 
  m1.message_from = m.message_from
  and m.message_id < m1.message_id
)
order by m.message_id desc

<强> demo

答案 1 :(得分:0)

看起来你真正想做的就是从小组中获得第一项。这是一个常见的问题,总是以不同的方式进行伪装,有关详细信息,请参阅此article

所以,你可以尝试这样的事情:

SELECT
   m.message_id,
   m.message_from,
   m.message_to,
   m.message_content
   m.message_seen
   m.message_datetime,
   m.message_status,
   p.profile_id,
   p.profile_photo,
   p.profile_username,
   p.profile_name
FROM message m
JOIN profiles p ON p.profile_id = m.message_from
WHERE(
   SELECT COUNT(*)
   FROM message msg
   WHERE msg.message_from = m.message_from AND msg.message_datetime <= m.message_datetime
   ) <= 1
ORDER BY m.message_id DESC;

那么where子句中的子查询将为每个message_from id提取最新消息。我在这里稍作修改以获取最新日期,而不仅仅是最新的message_id值。

答案 2 :(得分:-1)

试试这个:

SELECT 
    t2.maxID, 
    messages.message_from, 
    messages.message_to, 
    messages.message_content, 
    messages.message_seen, 
    messages.message_datetime, 
    messages.message_status, 
    profiles.profile_id, 
    profiles.profile_photo, 
    profiles.profile_username, 
    profiles.profile_name 
FROM 
    messages LEFT JOIN PROFILES 
    ON profiles.profile_id = messages.message_from
    LEFT JOIN
    (SELECT MAX(message_id) AS maxID,message_from FROM messages GROUP BY message_from) t2
    ON messages.message_from = t2.message_from
GROUP BY 
    messages.message_from
ORDER BY 
    t2.maxID DESC