我'我正在建立一个消息传递系统,我需要按发件人对消息进行分组,然后按降序排序,以便最新消息始终位于最前面。
查询
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
以上查询显示的内容。
这就是数据库结构的样子
如您所见, message_id 按降序排列,但不是最新的ID。
问题:
如何使用Group By和Order By一起显示上面数据库查询中来自数据库的最新消息,我缺少什么?
答案 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