Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql jOOQ中派生表上的相关性_Mysql_Sql_Jooq_Derived Table - Fatal编程技术网

Mysql jOOQ中派生表上的相关性

Mysql jOOQ中派生表上的相关性,mysql,sql,jooq,derived-table,Mysql,Sql,Jooq,Derived Table,我有一个简单的父子表(一对多相关表)。下面是一个简单的例子,我在跟踪火车及其位置 Table TRAIN - ID - NAME 每次列车到达车站时,将在列车状态中插入一条新的记录,记录相应的车站CD和到达时间(时间戳) 给定一个火车id,我想知道火车上最后一个已知的车站是什么: SQL解决方案:-使用派生表和相关子查询的组合 select t.ID, t.name, recent.STATION_CD from TRAIN t join ( select TR

我有一个简单的父子表(一对多相关表)。下面是一个简单的例子,我在跟踪火车及其位置

Table TRAIN
    - ID
    - NAME
每次列车到达车站时,将在列车状态中插入一条新的记录,记录相应的车站CD和到达时间(时间戳)

给定一个火车id,我想知道火车上最后一个已知的车站是什么:

SQL解决方案:-使用派生表和相关子查询的组合

select t.ID, t.name, recent.STATION_CD
from TRAIN t
join (
        select TRAIN_ID, STATION_CD
        from TRAIN_STATUS ts
        where ts.ARRIVAL_TIME = (
            select MAX(ARRIVAL_TIME) from TRAIN_STATUS where TRAIN_STATUS.TRAIN_ID = ts.TRAIN_ID
        )
) recent on t.ID=recent.TRAIN_ID
where t.ID = 1;
我无法用jOOQ拼凑出一个等价物。任何帮助都将不胜感激


编辑:方言是MySQL(5.7)。发布我自己的答案@LukasEder的建议。

您可以使用以下分析函数简化sql解决方案,并在jooq中使用:

select ID, name, station_cd from
(select t.ID, t.name, ts.STATION_CD, 
        row_number() over (partition by t.TRAIN_ID order by ts.ARRIVAL_TIME desc) as rn
  from train t join TRAIN_STATUS ts on t.TRAIN_ID = ts.TRAIN_ID) t
where rn = 1
TrainStatus ts=列车状态,如“ts”);
选择ConditionStep lastArrivalTime=dslContext
.选择(最大值(列车状态、到达时间))
.从(列车状态)
.其中(列车状态、列车ID、eq(st列车ID));
表最近=dslContext
.选择(ts.字段(列车状态.列车ID),ts.字段(列车状态.列车CD))
.来自(ts)
.where(ts.field(列车状态、到达时间)、eq(最后到达时间))
.不稳定(“最近”);
返回上下文
.选择(
列车识别号(“ID”),
最近状态字段(列车状态CD).as(“最近状态代码”)
)
.从(火车)
.join(最近).on(TRAIN.TRAIN\u ID.eq(最近.字段(TRAIN\u STATUS.TRAIN\u ID)))
.其中(列ID.eq(1))
.fetchOneInto(TrainStatusModel.class);

请标记您正在使用的数据库,如SQL server、Oracle、MySql等。我需要在jOOQ中解决这个问题,如原始帖子中所述。谢谢您的建议。@Keerthi:在大多数RDBMS中,有比您计划的方式更好的解决方法(即避免2x访问
TRAIN\u STATUS
表)。所以,张贴方言肯定会提供更好的答案。。。您尝试过什么jOOQ查询?“你为什么失败了?”卢卡塞德说,我简直无法思考,也无法用约克的话说解决问题。但那是昨天。我又打了一枪,打得很好。把它贴在原来的帖子里。我知道这个解决方案可能不是最理想的,但我故意希望它基于派生表和相关子查询-你知道我现在正在学习如何使用它们:)当然,我很想听到解决这个问题的最佳方法。@Keerthi:有意义。您知道,您可以在这里提供有关堆栈溢出的问题的答案。这样,对于这个问题的未来访问者来说,在这里跟踪您的进度和解决方案可能会更容易。对于MySQL 5.7,不支持分析函数和其他方法,我认为您已经找到了最好的方法。谢谢。当我掌握了分析函数后,我将重新讨论这个问题(并尝试在jOOQ中进行讨论)。
select ID, name, station_cd from
(select t.ID, t.name, ts.STATION_CD, 
        row_number() over (partition by t.TRAIN_ID order by ts.ARRIVAL_TIME desc) as rn
  from train t join TRAIN_STATUS ts on t.TRAIN_ID = ts.TRAIN_ID) t
where rn = 1
TrainStatus ts = TRAIN_STATUS.as("TS");

SelectConditionStep<Record1<LocalDateTime>> lastArrivalTime = dslContext
        .select(max(TRAIN_STATUS.ARRIVAL_TIME))
        .from(TRAIN_STATUS)
        .where(TRAIN_STATUS.TRAIN_ID.eq(st.TRAIN_ID));

Table<Record2<Long, String>> recent = dslContext
        .select(ts.field(TRAIN_STATUS.TRAIN_ID), ts.field(TRAIN_STATUS.STATUS_CD))
        .from(ts)
        .where(ts.field(TRAIN_STATUS.ARRIVAL_TIME).eq(lastArrivalTime))
        .asTable("recent");

return dslContext
        .select(
                TRAIN.TRAIN_ID.as("id"),
                recent.field(TRAIN_STATUS.STATUS_CD).as("recent_status_code")
        )
        .from(TRAIN)
        .join(recent).on(TRAIN.TRAIN_ID.eq(recent.field(TRAIN_STATUS.TRAIN_ID)))
        .where(TRAIN.ID.eq(1)) 
        .fetchOneInto(TrainStatusModel.class);