MySQL中如何根据特定条件选择最近记录的组

时间:2021-01-22 16:47:47

标签: mysql sql

我正在寻找一种方法来选择一组最近的记录。我有两张桌子:

表 1:

+---------+-------------+--------+--------+------------------+
| user_id | category_id | field1 | field2 |       date       |
+---------+-------------+--------+--------+------------------+
|      19 |           2 |      3 |      3 | 22/01/2021 15:00 |
|      19 |           1 |      1 |      3 | 22/01/2021 15:00 |
|      19 |           5 |      2 |      2 | 22/01/2021 15:00 |
|      18 |           1 |      2 |      2 | 22/01/2021 15:04 |
|      18 |          31 |      4 |      1 | 22/01/2021 15:04 |
|      18 |          40 |      3 |      1 | 22/01/2021 15:04 |
|      19 |          40 |      2 |      2 | 22/01/2021 15:21 |
|      19 |         166 |      1 |      1 | 22/01/2021 15:21 |
|      19 |          40 |      5 |      5 | 22/01/2021 16:23 |
|      19 |         166 |      6 |      6 | 22/01/2021 16:23 |
+---------+-------------+--------+--------+------------------+

表 2:

+---------+-------------+
| user_id | category_id |
+---------+-------------+
|      18 |           1 |
|      18 |          31 |
|      18 |          40 |
|      19 |          40 |
|      19 |         166 |
+---------+-------------+

我想从 Table1 中为 Table2 中存在的特定 user_idcategory_id 选择最近的行。例如,如果 user_id=19,我想获得以下记录组:

+---------+-------------+--------+--------+------------------+
| user_id | category_id | field1 | field2 |       date       |
+---------+-------------+--------+--------+------------------+
|      19 |          40 |      5 |      5 | 22/01/2021 16:23 |
|      19 |         166 |      6 |      6 | 22/01/2021 16:23 |
+---------+-------------+--------+--------+------------------+

我最接近的查询是有效的 fiddle,但这给了我 Table1 的最后四条记录。

2 个答案:

答案 0 :(得分:3)

这似乎对所有用户都做了你想要的:

SELECT T1.*
FROM Table1 t1
WHERE T1.DATE = (SELECT MAX(tt1.DATE)
                 FROM Table1 tt1 JOIN
                      Table2 tt2
                      ON TT1.user_id = Tt2.user_id AND
                         tt1.category_id = tt2.category_id
                 WHERE tt1.user_id = t1.user_id AND
                       tt1.category_id = t1.category_id
                ) 

您可以在外部查询中为特定用户添加过滤器。

答案 1 :(得分:2)

我认为最有效的方法是在 sql 中使用 Ties :

SELECT TOP 1 WITH TIES t1.*
 FROM Table1 t1 join Table2 t2 on t1.user_id=t2.user_id and t1.category_id=t2.category_id
ORDER BY ROW_NUMBER() OVER(PARTITION BY t1.[user_id],t1.[category_id] ORDER BY t1.date desc)
相关问题