【问题标题】:Having two MySQL tables, get the last result for each value of first table key有两个 MySQL 表,获取第一个表键的每个值的最后一个结果
【发布时间】:2021-03-07 08:46:33
【问题描述】:

我有两张桌子:

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.. |
----------------------------------------
  • 在两个表中,ID主增量键
  • TABLE_01 中,key1 + key2 列是唯一键(不能超过一个Key1 Key2 对)
  • TABLE_02 中,T_01 列引用了TABLE_01.ID

我的目标是,给定一个key1 值,能够通过DESC ORDER 上的对应timestamp 获得每个TABLE_01.ID 的最后一个TABLE_02 条目。

例如,如果我给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

【问题讨论】:

    标签: mysql sql datetime inner-join greatest-n-per-group


    【解决方案1】:

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

    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
    

    如果你想要第二个表的整行,那么我会推荐窗口函数:

    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
    

    【讨论】:

    • 首先非常感谢您!从第二个表中,我只需要timestamp,其他重要数据来自第一个表(Key2)。第一个查询是否有可能错过key1 = value 的条件?我曾尝试在from table_01 t1 之后添加WHERE t1.key = value.. 但它似乎不像这样工作。
    • 我已经设法“修复它”。经您许可,我将编辑答案,以便将其标记为已接受的答案。非常感谢你!真的很感激。
    猜你喜欢
    • 2014-06-06
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2017-12-17
    • 2021-11-27
    • 2015-11-12
    相关资源
    最近更新 更多