SQL-选择2列的最新独特组合

时间:2016-10-25 06:10:10

标签: mysql sql

我有一个包含以下列的SQL表。这4行是针对1位用户的。

| id | user_id | role_id | preference_order | updated_at          |
|----|---------|---------|------------------|---------------------|
| 83 | 45      | 7       | 1                | 2016-10-24 03:29:18 |
| 84 | 45      | 10      | 2                | 2016-10-24 03:29:18 |
| 85 | 45      | 7       | 1                | 2016-10-25 05:40:18 |
| 86 | 45      | 10      | 2                | 2016-10-25 05:40:18 |

快速选择user_idrole_id最新独特组合的方式是什么 - 所以第85行和第86行?

我能得到的最接近的是这个查询,但它取而代之的是行83和84:

SELECT * 
FROM user_role UR
GROUP BY UR.user_id, UR.role_id

我也试过这个,它得到了85和86但是对于一张大桌来说它似乎太慢了:

SELECT *
FROM user_role UR
JOIN (SELECT user_id, role_id, max(updated_at) updated_at FROM user_role GROUP BY user_id, role_id) UR2
    ON UR.user_id = UR2.user_id AND UR.role_id = UR2.role_id AND UR.updated_at = UR2.updated_at
ORDER BY UR.order ASC;

6 个答案:

答案 0 :(得分:1)

如果您需要多个user_id,则可以尝试此查询,role_id根据max updated_at:

return

答案 1 :(得分:0)

使用row_number()并按user_id&分区。 ROLE_ID

select  *
from
(
    select  *, rn = row_number () over (partition by user_id, role_id 
                                            order by updated_at desc)
    from    your_table 
) t
where   t.rn    = 1

答案 2 :(得分:0)

试试这个

            select 
            id , user_id , role_id , ord, updated_at
            from
            (
            SELECT * ,
            ROW_NUMBER() OVER ( PARTITION  BY ID ORDER BY  pdated_at DESC ) as RID
            FROM user_role UR
            )A 
            where RID in ('1','2') 

答案 3 :(得分:0)

在子查询中按update_at排序,然后在主查询中分组。

select * from (
  select * from user_role order by user_id asc ,role_id asc,updated_at desc
)UR GROUP BY UR.user_id, UR.role_id

答案 4 :(得分:0)

SELECT DISTINCT *
  FROM user_role
       NATURAL JOIN
       ( SELECT user_id, role_id, 
                MAX( updated_at ) AS updated_at 
           FROM user_role
          GROUP
             BY user_id, role_id ) AS t;

答案 5 :(得分:-1)

SELECT * 
FROM user_role UR
    LEFT JOIN user_role UR2 ON UR.user_id=UR2.user_id 
                           and UR.role_id=UR2.role_id 
                           and UR.updated_at<UR2.updated_at
WHERE UR2.updated_at IS NULL