我有一个带有以下各列的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;

最佳答案

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;

10-06 10:11