#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? Если это так, то это, безусловно, менее эффективно. Пока я не найду лучший подход или если кто-нибудь здесь может дать мне лучший подход, я буду придерживаться этого.