有两个 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.. |
----------------------------------------
- 在table上,
ID
是主增量键
- 在
TABLE_01
中,列 key1
+ key2
是 Unique Key(不能超过一个 Key1 Key2
夫妇)
- 在
TABLE_02
中,T_01
列引用了 TABLE_01.ID
我的目标是给定一个 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
我有两个 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.. |
----------------------------------------
- 在table上,
ID
是主增量键 - 在
TABLE_01
中,列key1
+key2
是 Unique Key(不能超过一个Key1 Key2
夫妇) - 在
TABLE_02
中,T_01
列引用了TABLE_01.ID
我的目标是给定一个 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