2010-07-04 60 views
2

所以我在CMS中的成員之間有這個消息數據庫。我想更改列表以顯示人員而不是特定消息。將其稱爲「線索」,但「我的消息」頁面中的每個線程都是您與之進行對話的成員,對吧?MySQL:在分組內排序?

所以,我明明做的是這樣:

select id, msgfrom, headline from member.msg where msgto = $myid 
group by msgfrom order by date desc 

權,但上述的問題是,它顯示第一個消息從每個「msgfrom」的標題。因此按日期排序適用於第一條消息的日期。即我希望返回的整個行代表組遵守特定的順序。

如果我要從數據庫中提取所有文本並按類別對它們進行分組,並顯示每個類別的最後一個文本,這將是相關的。全部在一個查詢中。

更糟糕的是,我還想獲取消息「線程」,其中另一方尚未響應(因此沒有msgto = $ myid,而是msgfrom = $ myid)以及分組應該在「msgto」而不是「msgfrom」

那麼,有什麼想法?

回答

3

如果我要從數據庫中提取所有文本,並按類別對它們進行分組,並顯示每個類別的最後一段文字,這將是相關的。全部在一個查詢中。

這是每天都會出現在這裏的經典「最大每組」查詢。有許多,許多辦法來解決它已經被前蓋(試行searching SO),但我給大家舉一個例子,讓你開始:

SELECT id, msgfrom, headline 
FROM (
    SELECT 
     id, msgfrom, headline, 
     @rn := CASE WHEN @prev_msgfrom = msgfrom 
        THEN @rn + 1 
        ELSE 1 
       END AS rn, 
     @prev_msgfrom := msgfrom 
    FROM (SELECT @prev_msgfrom := NULL) vars, member.msg 
    ORDER BY msgfrom, headline DESC 
) T1 
WHERE rn = 1 

我真的不明白你的問題的後半部分。你能否用一個例子更詳細地解釋它?你想把它作爲同一個查詢的一部分還是單獨的查詢?

+0

出於好奇,有沒有什麼特別的理由讓你選擇'CASE'而不是'IF'? – Mike 2010-07-04 09:29:59

+0

@Mike:不,沒有特別的理由。 IF也可以工作。 – 2010-07-04 09:35:07