如何编写SQL查询以确保两列独立?

时间:2010-09-27 15:47:41

标签: sql mysql

我有一个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中是否有一个简单,合理的快速查询?

2 个答案:

答案 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)列上的复合索引才能更快地完成。