2011-01-22 81 views
1

我有一個MySQL查詢像這樣:MySQL的GROUP BY/ORDER BY問題

SELECT 
     MAX(messages.ID) as maxID, 
     messages.from, 
     messages.read, 
       users.userName 
     FROM 
     messages 
     LEFT OUTER JOIN 
     users 
       ON 
       users.ID = messages.from 
     WHERE 
     messages.to = ? 
     GROUP BY 
     messages.from 
     ORDER BY 
     maxID DESC 

雖然這工作得很好,並且消息通過誰從大到小的順序發送它們的用戶是一羣,我現在有一個問題,當我想要通過messages.read行進行ORDER。我的代碼如下:

SELECT 
     MAX(messages.ID) as maxID, 
     messages.from, 
     messages.read, 
       users.userName 
     FROM 
     messages 
     LEFT OUTER JOIN 
     users 
       ON 
       users.ID = messages.from 
     WHERE 
     messages.to = ? 
     GROUP BY 
     messages.from 
     ORDER BY 
      messages.read ASC, 
     maxID DESC 

現在,messages.read返回用戶發送的第一條消息的行的值。但我需要用戶發送的最新(最高ID)的值。 我知道表中的第一個GROUP BY組,所以我該如何解決這個問題?

非常感謝你提前, 菲捨爾

回答

2

我知道GROUP BY由 首先在表組,所以我怎麼能得到 各地這樣做呢?

這實際上並不正確。它將返回一個隨機行。實際上,這通常是主鍵順序中的第一行,但沒有保證。 MySQL以外的數據庫不允許這種做法,並會引發錯誤。

無論如何,檢索未讀郵件的最高ID的一種方法是將消息表加入兩次。第二次連接只查找未讀消息。例如:

SELECT max(msg.ID) as MaxID 
,  messages.from 
,  max(unread.ID) as MaxUnreadID 
,  users.userName 
FROM users 
join messages msg 
on  users.ID = msg.from 
     and messages.to = ? 
left join  
     messages unread 
on  users.ID = unread.from 
     and messages.to = ? 
     and unread.read = 0 
GROUP BY 
     users.ID 
,  users.userName 
+0

謝謝你的回答。我不知道MySQL會在GROUP BY上返回一個隨機行:)但是,如果未讀,messages.read爲0,如果讀取,則爲1。所以我不認爲我能從你的建議中完成我想要的東西! – fischer 2011-01-22 12:43:58

0

我完全不明白的SQL語句的含義,但你可以在主選擇使用subslect沒有組和後記。試試這個:

SELECT 
    * 
FROM 
    (
     SELECT 
      MAX(messages.ID) as maxID, 
      messages.from, 
      messages.read, 
      users.userName 
     FROM 
      messages 
     LEFT OUTER JOIN 
      users 
      ON 
      users.ID = messages.from 
     WHERE 
      messages.to = ? 
     ORDER BY 
      messages.read ASC, 
      maxID DESC 
    ) AS msg 
GROUP BY 
    msg.from