代码之家  ›  专栏  ›  技术社区  ›  Chris B.

如何编写确保两列独立唯一的SQL查询?

  •  0
  • Chris B.  · 技术社区  · 14 年前

    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最多出现一次,并且首选项是最近一次使用的日期。就我而言,用户 1 和资源 2 完全不出现(尽管如果 1 2 2010-09-02 出现在结果中)。此查询需要在潜在的大型数据库(500000多行)上运行。在SQL中是否有一个简单、快速的查询来实现这一点?

    2 回复  |  直到 14 年前
        1
  •  1
  •   OMG Ponies    14 年前

    使用:

    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
    
        2
  •  0
  •   Mchl    14 年前

    就这样开始吧

    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) 列使它更快。