多个计数字段的总和

时间:2017-05-01 10:30:24

标签: mysql select aggregate-functions jooq

我尝试用JOOQ和MySQL数据库对mutliple计数字段求和。

目前我的代码看起来像这样:

int userId = 1;
Field<Object> newField = DSL.select(DSL.count()).from(
                DSL.select(DSL.count())
                        .from(REQUIREMENT)
                        .where(REQUIREMENT.CREATOR_ID.equal(userId))
                        .unionAll(DSL.select(DSL.count())
                                .from(REQUIREMENT) 
                                .where(REQUIREMENT.LEAD_DEVELOPER_ID.equal(userId)))

总是返回2作为newField。但我想知道用户是需求的创建者多少次PLUS是需求的主要开发者。

1 个答案:

答案 0 :(得分:1)

你说“总和多次计算”,但这不是你正在做的事情。你做“计算计数”。当然,解决方案是这样的:

// Assuming this to avoid referencing DSL all the time:
import static org.jooq.impl.DSL.*;

 select(sum(field(name("c"), Integer.class)))
.from(
     select(count().as("c"))
    .from(REQUIREMENT)
    .where(REQUIREMENT.CREATOR_ID.equal(userId))
    .unionAll(
     select(count().as("c"))
    .from(REQUIREMENT) 
    .where(REQUIREMENT.LEAD_DEVELOPER_ID.equal(userId)))
);

或者,如果您打算在总和中添加更多这些计数,这可能是一个更快的选择:

 select(sum(choose()
    .when(REQUIREMENT.CREATOR_ID.eq(userId)
        .and(REQUIREMENT.LEAD_DEVELOPER_ID.eq(userId)), inline(2))
    .when(REQUIREMENT.CREATOR_ID.eq(userId), inline(1))
    .when(REQUIREMENT.LEAD_DEVELOPER_ID.eq(userId), inline(1))
    .otherwise(inline(0))
 ))
.from(REQUIREMENT);

More details about the second technique in this blog post