MySQL GROUP BY / ORDER BY问题

时间:2011-01-22 11:56:44

标签: sql mysql

我有一个像这样的MySQL查询:

   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

虽然这个工作正常并且消息是由以DESCENDING顺序发送它们的用户分组的,但是当我想要对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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我并不完全理解sql的含义,但您可以在主选择中使用没有组和组后缀的子选项。试试这个:

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