Вот это был подводный камень... При плановой оценке в часик, было потрачено более 6 часов с усердными изысканиями.
Задача стояла в формировании выборки средних рейтингов по компаниями и типам оценок.
Призма хоть и умеет уже в группировку, но весьма ограничено и с сортировкой в таких случаях все очень плохо. Вот такой запрос был на призме:
Но проблема в первую очередь в том, что сортировка в призме в groupBy возможна только по полям, указанным в by (то есть по которым группируется), но не по значениям avg и т.п. (а надо-то именно по ним, чтобы от больших оценок к меньшим отсортировать).
Вторая проблема в том, что к такой конструкции призма не позволяет добавить select(), то есть выборку дополнительных полей. В моем случае надо было сразу получить и данные компаний, чтобы не делать потом кучу запросов на получение данных компаний для каждого результата в отдельности.
Сначала быстро накидал чистый SQL-запрос, но там нет типизации нифига, то есть результат просто как any. А хотелось, чтобы с проверкой типов и т.п. В итоге подключил knex. Тот тоже уже немного в ТС умеет, но все же во многом путается. Пришлось конструировать 3-хуровневую конструкцию, чтобы с типами было боле менее ОК. Конечно не идеально, но в целом весьма удовлетворительно получилось. Вот такой запрос получился: https://github.com/gorodskie-bani-ru/nextjs/blob/078e051afeafc76e19c804a88ba3da284972952e/server/nexus/types/Query/definitions/society/Vote/index.ts#L80-L195
На выходе вот такой SQL:
Кстати, вот здесь можно поиграться с knex: https://dgadelha.github.io/knex-playground/