Написать запрос с подсчетом рейтингов и группировкой по компаниям

Завершена
Планируемый запуск: Дата начала: 07.03.2021Планируемое завершение: Дата завершения: 07.03.2021

Описание задачи

{"blocks": [{"key": "46sja", "data": {}, "text": "", "type": "unstyled", "depth": 0, "entityRanges": [], "inlineStyleRanges": []}, {"key": "1hg0", "data": {}, "text": "Решение: https://github.com/gorodskie-bani-ru/nextjs/commit/078e051afeafc76e19c804a88ba3da284972952e", "type": "unstyled", "depth": 0, "entityRanges": [{"key": 0, "length": 91, "offset": 9}], "inlineStyleRanges": []}, {"key": "e6o81", "data": {}, "text": "", "type": "unstyled", "depth": 0, "entityRanges": [], "inlineStyleRanges": []}], "entityMap": {"0": {"data": {"url": "https://github.com/gorodskie-bani-ru/nextjs/commit/078e051afeafc76e19c804a88ba3da284972952e"}, "type": "LINK", "mutability": "MUTABLE"}}}

Вот это был подводный камень... При плановой оценке в часик, было потрачено более 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/