Как создать mysql-эквивалент group_concat с несколькими полями в jooq?

#mysql #jooq

#mysql #jooq

Вопрос:

Как мы можем достичь эквивалента этого оператора в jooq?

 select course.course_id, 
       group_concat(course_user.user_id, ":", course_user.current_state) 
from course 
left join course_user 
on course.course_id = course_user.course_id 
group by course.course_id;
 

Результатом вышеизложенного в mysql будет что-то вроде

 1   58:COMPLETED,11908:ASSIGNED,11919:COMPLETED,11920:ASSIGNED
2   11913:PENDING_APPROVAL,11919:COMPLETED,11921:COMPLETED
 

Как мы можем добиться этого в jooq? groupConcat в jooq принимает только один параметр поля или принимает одно поле и одну строку-разделитель.

Ответ №1:

Я решил это, используя groupConcat поверх concat таким образом —

 DSL.groupConcatDistinct(DSL.concat(COURSE_USER.USER_ID, DSL.val(":"), COURSE_USER.CURRENT_STATE))
 

По какой-то причине, если я не использую distinct, я получаю каждую запись в виде двух значений. Вероятно, потому, что он выполняется один раз для concat и снова для group concat? Если это так, то это, безусловно, менее эффективно. Пока я не найду лучший подход или если кто-нибудь здесь может дать мне лучший подход, я буду придерживаться этого.