2011-01-22 62 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