繁体   English   中英

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

[英]How to select the group of most recent records based on specific conditions in MySQL

我正在寻找 select 组最近记录的方法。 我有两张桌子:

表格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 |
+---------+-------------+

我想 select 表 1 中存在于表 2 中的特定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 |
+---------+-------------+--------+--------+------------------+

我最接近的查询是工作小提琴,但这给了我 Table1 的最后四个记录。

这似乎为所有用户做你想做的事:

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
                ) 

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

我认为最有效的方法是在 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM