У вас все в порядке: в этом SQL нет ничего необычного, и все можно представить с помощью API Knex. Однако имеет смысл выразить неявное объединение:
FROM users, posts
как явное объединение:
FROM users
JOIN posts ON users.id = posts.user_id
, означающее, что вы можете отбросить первую часть вашего предложения WHERE
. Это будет выглядеть примерно так:
knex
.select("posts.*", "users.full_name")
.sum("voted.vote")
.from("users")
.join("posts", "posts.user_id", "users.id")
.leftOuterJoin("voted", "posts.id", "voted.post_id")
.where("posts.group_id", groupId)
.groupBy("posts.id")
.groupBy("voted.post_id")
.groupBy("users.full_name")
Это приводит к выводу SQL:
'select "posts".*, "users"."full_name", sum("votes"."vote") from "users" ' +
'inner join "posts" on "posts"."user_id" = "users"."id" left outer ' +
'join "voted" on "posts"."id" = "voted"."post_id" where ' +
'"posts"."group_id" = ? group by "posts"."id", "voted"."post_id", ' +
'"users"."name"'
Вы также можете обнаружить, что некоторые из ваших GROUP BY
не нужны, нопосмотрим, как вы ладите.