小编典典

MySQL GROUP BY / ORDER BY问题

sql

我有一个这样的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

虽然这可以正常工作,并且消息是按降序发送的用户分组的消息,但是现在我想对message.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按表中的第一个分组,那么我该如何解决呢?

谢谢您,菲舍尔(Fischer)


阅读 163

收藏
2021-04-22

共1个答案

小编典典

我知道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
2021-04-22