JOOQ查询获取每个用户的最新记录

问题描述 投票:0回答:1

我创建了一种肮脏的方法来做到这一点,它有效,但想知道是否有更简单的方法可以实现这一点。基本上我只想为每个用户获取最新的用户工具 ID。预先感谢!

var allUserTools = masterDB.select(Tool.USER_ID, Tool.USER_TOOL_ID)
                    .from(Tool.TABLE)
                    .orderBy(Tool.FINISHED.desc())
                    .fetchGroups(Tool.USER_ID, UserTool.USER_TOOL_ID));


    List<Integer> allUserToolIDs = new ArrayList<>();
    for (Map.Entry<Integer, List<Integer>> userTool : allUserTools.entrySet()) {
        if(!userTool.getValue().isEmpty()) {
            allUserToolIDs.add(userTool.getValue().get(0));
        }
    }
java database postgresql record jooq
1个回答
0
投票

这是一个 TOP N 每个类别查询的示例,更具体地说,由于您只对每个类别(或组)的“TOP 1”行感兴趣,因此 PostgreSQL 有一个简单的解决方案,使用

DISTINCT ON 

SELECT DISTINCT ON (USER_ID), USER_ID, USER_TOOL_ID
FROM TOOL
ORDER BY USER_ID, USER_TOOL_ID, FINISHED DESC

这可以理解为仅获取

(USER_ID, USER_TOOL_ID)
元组的不同值,根据
ORDER BY
子句更喜欢第一个值。这是一种相当深奥的语法,也可以使用窗口函数来完成,更详细(请参阅手册页)。

在 jOOQ 中:

masterDB.select(TOOL.USER_ID, TOOL.USER_TOOL_ID)
        .distinctOn(TOOL.USER_ID)
        .from(TOOL)
        .orderBy(TOOL.USER_ID, TOOL.USER_TOOL_ID, TOOL.FINISHED.desc())
        .fetch();
© www.soinside.com 2019 - 2024. All rights reserved.