我有一个像这样的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是表中的第一个组,所以我怎么能绕过这个呢?
非常感谢您提前, 菲舍尔
答案 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