Для классической задачи ранжирования (сумма лучших 3 результатов на игрока) я придумал следующий подзапрос, используя jOOQ DSL и Scala (для встраивания как выберите значение и включите в более сложный запрос):
val tr1 = TOUR_RESULT.as("tr1")
val tr2 = TOUR_RESULT.as("tr2")
val inner:Table[Record1[java.lang.Integer]] = DSL.select(count().as("count")).from(tr2).where(tr1.PLAYER_ID.eq(tr2.PLAYER_ID).and(tr1.NSP_SCORE.le(tr2.NSP_SCORE))).asTable("tr3")
val result = sql.select(tr1.PLAYER_ID,tr1.NSP_SCORE.sum().as("score"))
.from(tr1)
.where(inline(3).gt(sql.selectQuery(inner)))
.groupBy(tr1.PLAYER_ID)
.orderBy(2)
.execute()
Моя проблема в настоящее время (с использованием MariaDB 10 и jOOQ 3.9) заключается в том, чтобы заставить этот сгенерированный запрос вообще работать с MySQL и сортировать по убыванию «Score» (столбец 2).
Я уверен, что смогу переписать весь оператор, используя необработанный оператор SQL и приведя результат (следовательно, в обход API jOOQ). Однако я хотел бы оставаться чистым с компилятором и API jOOQ как моим пастухом как можно дольше. Так что, возможно, есть решение, которое будет доступно для чтения в будущем, если мне когда-нибудь придется снова коснуться этого запроса.
Схему и сгенерированный SQL, иллюстрирующий случай, можно найти в
http://sqlfiddle.com/#!9/2f614f/3 с оскорбительными строками / высказываниями в комментариях.
create table TOUR_RESULT (
player_id int,
nsp_score int
);
insert into TOUR_RESULT values (1,4);
insert into TOUR_RESULT values (1,14);
insert into TOUR_RESULT values (1,24);
insert into TOUR_RESULT values (1,34);
insert into TOUR_RESULT values (1,44);
insert into TOUR_RESULT values (2,3);
insert into TOUR_RESULT values (2,13);
insert into TOUR_RESULT values (2,23);
insert into TOUR_RESULT values (2,33);
insert into TOUR_RESULT values (2,43);
insert into TOUR_RESULT values (3,3);
insert into TOUR_RESULT values (3,13);
insert into TOUR_RESULT values (4,130);
insert into TOUR_RESULT values (5,2);
insert into TOUR_RESULT values (5,7);
insert into TOUR_RESULT values (5,7);
insert into TOUR_RESULT values (5,7);
insert into TOUR_RESULT values (5,5);
insert into TOUR_RESULT values (5,7);
insert into TOUR_RESULT values (5,10);
insert into TOUR_RESULT values (5,12);
SELECT `tr1`.`player_id`, sum(`tr1`.`nsp_score`) AS `score`
FROM `tour_result` AS `tr1`
WHERE 3 >=
-- (SELECT `tr3`.`count`
-- FROM
(SELECT count(*) AS `count`
FROM `tour_result` AS `tr2`
WHERE (`tr1`.`player_id` = `tr2`.`player_id`
AND `tr1`.`nsp_score` <= `tr2`.`nsp_score`))
-- AS `tr3`)
GROUP BY `tr1`.`player_id`
ORDER BY 2 desc;
Ошибка при раскомментировании строк:
Unknown column 'tr1.player_id' in 'where clause'