有两个 MySQL tables,获取第一个 table 键的每个值的最后结果

Having two MySQL tables, get the last result for each value of first table key

我有两个 table:

TABLE_01
-------------------------------
| ID         | Key1   | Key2  |
-------------------------------
| 1          | 504    | 101   |
| 2          | 504    | 102   |
| 3          | 505    | 101   |
| 4          | 505    | 103   |
| 5          | 508    | 101   |
| 6          | 510    | 104   |
| 7          | 509    | 101   |
-------------------------------

TABLE_02
----------------------------------------
| ID      | T_01 | timestamp | data    |
----------------------------------------
| 1       | 1    | ts_01     | ..abc.. |
| 2       | 1    | ts_02     | ..dfg.. |
| 3       | 2    | ts_03     | ..hij.. |
| 4       | 3    | ts_04     | ..klm.. |
| 5       | 1    | ts_05     | ..nop.. |
| 6       | 4    | ts_06     | ..qrs.. |
| 7       | 3    | ts_07     | ..tuv.. |
| 8       | 5    | ts_08     | ..wxy.. |
| 9       | 2    | ts_09     | ..z.... |
| 10      | 4    | ts_10     | ..abc.. |
----------------------------------------

我的目标是给定一个 key1 值,能够为每个 TABLE_01.ID 获得 TABLE_02 的最后一个条目 timestamp [=28] =].

比如我给505,输出应该是:

KEY1  |  KEY2  |  TIMESTAMP
---------------------------
505   |  103   |  ts_10          ---> FROM TABLE_01.Id = 4
505   |  101   |  ts_07          ---> FROM TABLE_01.Id = 3

如您所见,它仅显示 TABLE_01.ID = 4 情况下的最后一个条目(即 505 | 103)

我试过这样做:

SELECT `t1`.`Key1`, `t1`.`key2`, `t2`.`timestamp` 
FROM `TABLE_02` AS t2 
INNER JOIN `TABLE_01` AS t1 
WHERE `t1`.`key1` = '505' 
ORDER BY `t2`.`ID` 
DESC LIMIT 100

此查询的问题在于,由于我使用的是 t2.timestamp,因此我收到了所有结果,而不是每个结果只有一个。另外,我没有在 TABLE_02.

上正确使用 TABLE_01.ID

如果您只想要第一个 table 中每个键组合的第二个 table 中的最新时间戳,您可以加入和聚合:

select t1.key1, t1.key2, max(t2.timestamp) max_t2_timestamp
from table_01 t1
inner join table_02 t2 on t2.t_01 = t1.id
group by t1.key1, t1.key2

如果你想要第二行的整行table,那么我会推荐window函数:

select *
from (
    select t1.key1, t1.key2, t2.*,
        row_number() over(partition by t1.key1, t1.key2 order by t2.timestamp desc) rn
    from table_01 t1
    inner join table_02 t2 on t2.t_01 = t1.id
    group by t1.key1, t1.key2
) t
where rn = 1