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