2017-05-01 1 views
2

JOOQ 및 MySQL 데이터베이스로 여러 개의 카운트 필드를 합산하려고합니다. 순간여러 카운트 필드의 합

내 코드는 다음과 같습니다 : 항상 newField으로 2를 반환

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))) 

합니다. 그러나 사용자가 요구 사항을 만든 개발자가 요구 사항의 주요 개발자를 몇 번 추가했는지 알고 싶습니다.

답변

1

당신은 "합계 여러 번에 걸쳐"라고 말하지만, 그게 당신이하는 일이 아닙니다. "카운트 카운트 수"를 수행합니다. 이 솔루션은 물론,이 같은 것입니다 :

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

: 당신은 합이 카운트의 더 많은 추가하려는 경우, 또는

// 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))) 
); 

이 더 빠른 옵션이 될 수 있습니다

+0

일반적으로 귀하의 도움과 jOOQ를 보내 주셔서 감사합니다! 첫 번째 솔루션은 컴파일러 오류를 가져옵니다. DSL의 sum (org.jooq.Field )은 (org.jooq.Field )에 적용 할 수 없습니다. 하지만 두 번째 아이디어는 잘 작동합니다. 감사! – user1482309

+0

좋은 말 주셔서 감사합니다. 그래, 당신 말이 맞아. 첫 번째 예가 수정되었습니다. –