2014-11-22 60 views
1

我正在製作消息系統,我需要按發件人和訂單按降序對消息進行分組,以便最新消息始終位於最前面。使用GROUP BY和ORDER BY一起檢索最新消息

查詢

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和排序一起從上面的數據庫查詢數據庫顯示最新的消息,我在想什麼?

+0

什麼是最新的message_id? – Edrich 2014-11-22 08:22:07

+0

@Edrich請參閱我的更新問題。 – 2014-11-22 08:25:01

回答

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

它的工作表示感謝! – 2014-11-22 18:39:08

+0

這是個好主意。不過,我想建議@RedVirus,如果你想獲得最新的*最近的*消息,你應該過濾最新的日期,而不一定是最新的ID,但只有在你的上下文中它確實有意義時纔會這樣做。 – AdamMc331 2014-11-22 19:35:09

+0

@ McAdam331感謝您的建議。 – 2014-11-23 00:38:09

-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 
+0

不起作用。我相信你的回答和我的問題一樣。這也給了我相同的結果。 – 2014-11-22 08:33:42

+0

@RedVirus請參閱我的答案更新。就像這項工作一樣。 – Edrich 2014-11-22 09:33:11

+0

當你至少可以對你正在做的修改給出一些解釋,而不是像這樣刪除一段代碼時,這會更好。即使它確實解決了他們的問題,也不利於他們向前邁進,或幫助那些偶然發現這個問題的新用戶。 – AdamMc331 2014-11-22 16:34:45

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值。