SQL:返回用户

时间:2015-10-19 19:10:01

标签: mysql sql oracle

我有一张表格如下:

CREATE TABLE useractions
(
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    user_id INT,
    modified BIGINT, //this is the time of the action in milliseconds
    status INT,      // 1 = placed, 2 = processing ,3 = shipping or 4 = completed, 5 = failed
    action_id INT    // 1 = buy, 2 = sell, 3 = exchange, etc
);

现在,给定一个action_id,如何创建一个SQL查询,该查询返回给定action_id的每个用户的最新动作列表(除了1之外的任何status)?该表很大(50k到100k行)所以我试图通过不扫描并返回整个表并稍后检查Java中的最新操作来提高效率。

到目前为止,我的尝试是检索整个表,然后在ResultSet(Java)中收集最新的操作。但我觉得我可以避免这种效率低下的方式。

请注意,每个代理可以有多个相同action_id的操作,我只需要检索其最新操作:每个用户一个操作。 modified列表示操作的创建时间。

该查询应该适用于MySQL和Oracle数据库。

注意:我真诚地希望不要用其他问题来分散人们的注意力,比如为什么类型是BIGINT,或者100k不大......所以这里是一个单挑:因为表是由创建的我的团队,我不允许改变它。并且频繁调用查询,因此查询需要高效。

1 个答案:

答案 0 :(得分:1)

没有任何数据这真的很难回答。但是这里有一个刺痛

SELECT t.user_id, max(t.modified) as modified, t.status
FROM table t
JOIN
(   SELECT user_id
    FROM table
    WHERE action_id <> 1 and status = whatever 
)t1 ON t1.user_id = t.user_id
GROUP BY t.user_id