Я пытаюсь запрашивать сообщения и использовать «счетчик», чтобы получить общее количество комментариев и лайков для отображения. Мой запрос выглядит так
const posts = await knex
.from("posts")
.select("posts.id as id", "posts.text", "posts.user_id")
.leftJoin("comments", "comments.post_id", "posts.id")
.count("comments.post_id as comments")
.leftJoin("likes", "likes.post_id", "posts.id")
.count("likes.post_id as likes")
.groupBy("posts.id");
res.send(posts);
Однако я получаю другие результаты, если исключаю комментарии или лайки и делаю что-то вроде этого:
const posts = await knex
.from("posts")
.select("posts.id as id", "posts.text", "posts.user_id")
.leftJoin("comments", "comments.post_id", "posts.id")
.count("comments.post_id as comments")
.groupBy("posts.id");
res.send(posts);
Я чувствую, что делаю что-то не так. Как правильно связать несколько «count» и «leftJoins»?
Сначала начните с SQL-запроса, а затем преобразуйте его в Knex.
Как сказал @nbk, когда вы присоединяетесь к комментариям в конечном результате, вы получите строку для каждого комментария.
Один из вариантов использует подзапрос в select, запрос будет выглядеть так:
Select posts.id as id, posts.text, posts.user_id,
(Select count(*) from comments where comments.post_id=posts.id) as comments,
(Select count(*) from likes where likes.post_id=posts.id) as likes,
From posts;
Этот запрос можно преобразовать в Knex:
const posts = await knex
.from('posts')
.select(
'posts.id as id',
'posts.text',
'posts.user_id',
knex('comments')
.count('*')
.whereRaw('?? = ??', ['comments.post_id', 'posts.id'])
.as('comments'),
knex('likes').count('*').whereRaw('?? = ??', ['likes.post_id', 'posts.id']).as('likes')
);
объединение таблиц может привести к умножению строк, сначала сделайте свой запрос в графическом интерфейсе, таком как workbench. совет задницы, когда вы используете первую функцию группировки и присоединяетесь позже, вы получите свой результат