【问题标题】:SELECT last records for each ID with multiple JOINS in one query在一个查询中选择具有多个 JOINS 的每个 ID 的最后记录
【发布时间】:2021-12-28 19:59:51
【问题描述】:

我有这些表:

blocks TABLE        blocks_fields TABLE              
id|user_id|name     id|block_id|options_id|status    
 1|      1|block1    1|       1|         1|     1
 2|      1|block2    2|       2|         2|     0 
 3|      1|block3    3|       3|         3|     2
 4|      1|block4    4|       4|         1|     1

blocks_events TABLE        blocks_options TABLE
id|field_id|event|code     id|value1|value2
 1|       1| ev1 | 1234     1|    10|     A
 2|       2| ev1 | 5678     2|    20|     B
 3|       1| ev2 | 1234     3|    30|     C
 4|       3| ev1 | 9012     4|    10|     A

我正在尝试为每个代码选择最后一个事件(最后插入的行),只知道 user_id

输出应该是这样的:

blocks_events.event|blocks_events.code|blocks_options.value1|blocks_options.value2
                ev2|              1234|                   10|                    A
                ev1|              5678|                   20|                    B
                ev1|              9012|                   30|                    C

我知道如何通过多项选择获得此输出,但我想知道是否可以只选择一次。

【问题讨论】:

  • 什么决定了“最后的事件”是什么?
  • 最后插入的行
  • 您说“只知道 user_id”,但似乎显示所有用户 id 的预期结果
  • 你是对的,我写错了ID。我更新了表格以反映正确的值。
  • 你的意思是最高的block_events.id吗?还是有插入的时间戳? (对应该是不透明的 ID 进行排序并不理想;这意味着您将永远无法插入历史数据,或者无法轻松地从应该插入的行没有插入的问题中恢复)

标签: mysql group-by max inner-join


【解决方案1】:

这只是简单的内部连接,使用 row_number 仅获取每个代码的最新事件:

select event,code,value1,value2
from (
    select be.event,be.code,bo.value1,bo.value2,row_number() over (partition by be.code order by be.id desc) rn
    from blocks b
    join blocks_fields bf on bf.block_id=b.id
    join blocks_events be on be.field_id=bf.id
    join blocks_options bo on bo.id=bf.options_id
    where b.user_id=1
) latest_events_for_code
where rn=1

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2020-07-29
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多