1

可能重复:
检索每个组中的最后一条记录

我有两个类似的表设置(为任务简化):

行动——

id - user_id - action - time

用户 -

id - name

我想为每个用户输出最新的动作。我不知道该怎么做。

我对 SQL 不是很好,但从我查找的内容来看,它应该类似于以下内容。不过不确定。

SELECT `users`.`name`, *
FROM users, actions
JOIN < not sure what to put here >
ORDER BY `actions`.`time` DESC
< only one per user_id >

任何帮助,将不胜感激。

4

6 回答 6

1

您需要进行分组最大值 - 请参阅此处的示例http://jan.kneschke.de/projects/mysql/groupwise-max/

这是我为其他人做的一个例子,它与您的要求相似:

http://pastie.org/925108

select
 u.user_id,
 u.username,
 latest.comment_id
from
 users u
left outer join
(
  select
   max(comment_id) as comment_id,
   user_id
  from
   user_comment
  group by
   user_id
 ) latest on u.user_id = latest.user_id;
于 2010-04-17T22:52:56.370 回答
1
SELECT * FROM users JOIN actions ON actions.id=(SELECT id FROM actions WHERE user_id=users.id ORDER BY time DESC LIMIT 1);
于 2010-04-17T22:31:06.507 回答
0

在我看来,以下将是有效的

WITH GetMaxTimePerUser (user_id, time) (
    SELECT user_id, MAX(time)
    FROM actions
    GROUP BY user_id
)
SELECT u.name, a.action, amax.time
FROM actions AS a
    INNER JOIN users AS u ON u.id=a.user_id
    INNER JOIN GetMaxTimePerUser AS u_maxtime ON u_maxtime.user_id=u.id
WHERE a.time=u_maxtime.time

使用没有子查询和 OUTER JOIN 的临时命名结果集(公用表表达式或 CTE)是查询优化的最佳方式。(CTE 类似于 VIEW,但仅存在虚拟或内联)

于 2010-04-18T01:04:39.777 回答
0

select u.name, a.action, a.time
from user u, action a
where u.id = a.user_id
and a.time in (select max(time) from action where user_id = u.user_id group by user_id )



注意未经测试-但这应该是模式

于 2010-04-17T22:50:57.823 回答
0
DECLARE @Table (ID Int, User_ID, Time DateTime)

-- This gets the latest entry for each user
INSERT INTO @Table (ID, User_ID, Time)
SELECT ID, User_ID, MAX(TIME)
FROM actions z
INNER JOIN users x on x.ID = z.ID
GROUP BY z. userID

-- Join to get resulting action
SELECT z.user_ID, z.Action
FROM actions z 
INNER JOIN @Table x on x.ID = z.ID
于 2010-04-17T22:53:21.200 回答
0

这是 Stack Overflow 上经常出现的最大每组问题。关注这个问题的几十个其他帖子的标签。

鉴于您的架构没有子查询并且没有,这是在 MySQL 中执行此操作的方法GROUP BY

SELECT u.*, a1.*
FROM users u JOIN actions a1 ON (u.id = a1.user_id)
LEFT OUTER JOIN actions a2 ON (u.id = a2.user_id AND a1.time < a2.time)
WHERE a2.id IS NULL;

换句话说,向用户展示她的动作,这样如果我们在稍后搜索同一用户的另一个动作,我们就找不到。

于 2010-04-17T22:57:37.697 回答