2012-10-13 45 views
0

我目前得到这个查询后:与列的最大值选择条目分组

SELECT 
    `users_sessions`.`userid` `users_sessions`.`lastActive` , `users`.`firstname` 
FROM 
    `users_sessions` , `users` 
WHERE 
    `users_sessions`.`lastActive` >= DATE_SUB(NOW() , INTERVAL 60 MINUTE) 
AND 
    `users`.`uidNumber` = `users_sessions`.`userid` 

它选择的所有会话,其中lastActive是1小时前最大。现在,由于用户可以同时进行多个会话,因此我只想选择具有最大值lastActive的那个会话。

我知道我以某种方式必须使用GROUP BY users_sessions.userid,然后选择最大的条目lastActive

我该如何正确地做到这一点?

回答

1
SELECT 
    `users_sessions`.`userid`, `users_sessions`.`lastActive` , `users`.`firstname` 
FROM 
    `users_sessions` , `users` 
WHERE 
    `users_sessions`.`lastActive` >= DATE_SUB(NOW() , INTERVAL 60 MINUTE) 
AND 
    `users`.`uidNumber` = `users_sessions`.`userid` 
GROUP BY 
    `users_sessions`.`userid`, `users_sessions`.`lastActive` , `users`.`firstname` 
HAVING 
    `lastActive` = MAX(`lastActive`) 
+0

在您的“GROUP BY”部分中,您按所有选定的列进行分组。在我最初的查询中,我选择了更多的列。我是否也应该由所有人组成? – Zulakis

+0

您必须始终按所有选定列进行分组。 –

+0

如果有人在看这个,答案是不正确的。 'HAVING'子句将'lastActive'的任意值与最大值进行比较,这可能会不必要地过滤掉某些行。 –

1

只需选择MAX(users_sessionslastActive代替users_sessionslastActive并使用GROUP BY usersuidNumber。它应该工作。

+1

这样做可能会导致一个微妙的错误,因为显示的行不一定是具有lastActive的行。您显示该组中的一个随机行,然后添加具有最高lastActive的行中的lastActive。可能不是同一排。 –

+0

我在select子句中选择了lastActive的最大值而不是lastActive。所以据我所知,这不应该是你问的问题。 – taufique

+0

您从具有相同ID的行组中获得最高的lastActive,但不是具有最高lastActive的行。这是按顺序选择的。我的答案会得到正确的排。在这个用例中,你可能不会注意到任何错误,但是可能会有更多的列。 –