我有一张表格如下:
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不大......所以这里是一个单挑:因为表是由创建的我的团队,我不允许改变它。并且频繁调用查询,因此查询需要高效。
答案 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