我有一个MySQL表,如下所示:
user_id resource_id last_used
--------------------------------
1 1 2010-09-01
1 2 2010-09-02
1 3 2010-09-04
2 3 2010-09-08
2 2 2010-09-03
3 1 2010-09-01
3 1 2010-09-05
我需要编写一个查询,告诉我哪个用户最后使用了哪个资源,每个用户和每个资源最多只列出一次(如果没有列出某些用户和某些资源,则可以)。在上面的例子中,我想要以下结果集:
user_id resource_id last_used
--------------------------------
2 3 2010-09-08
3 1 2010-09-05
请注意,每个用户ID最多只出现一次,每个资源ID最多出现一次,并优先考虑最近的last_used日期。我的目的是用户1
和资源2
根本没有出现(尽管如果1 2 2010-09-02
出现在结果中也没问题)。此查询需要在可能很大的数据库(500,000多行)上运行。在SQL中是否有一个简单,合理的快速查询?
答案 0 :(得分:1)
使用:
SELECT x.*
FROM YOUR_TABLE x
JOIN (SELECT t.resource_id,
MAX(t.last_used) AS max_last
FROM YOUR_TABLE t
GROUP BY t.resource_id) y ON y.resource_id = x.resource_id
AND y.max_last = x.last_used
答案 1 :(得分:0)
尝试这样开始
SELECT
t.user_id, t.resource_id, t.last_used
FROM
tableName AS t
CROSS JOIN (
SELECT resource_id, MAX(last_used) AS last_used FROM tableName GROUP BY resource_id
) AS sq
USING (resource_id, last_used)
您可能需要(resource_id, last_used)
列上的复合索引才能更快地完成。