Множественный подсчет и левые соединения в узле MySQL с использованием knex

Я пытаюсь запрашивать сообщения и использовать «счетчик», чтобы получить общее количество комментариев и лайков для отображения. Мой запрос выглядит так

  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»?

объединение таблиц может привести к умножению строк, сначала сделайте свой запрос в графическом интерфейсе, таком как workbench. совет задницы, когда вы используете первую функцию группировки и присоединяетесь позже, вы получите свой результат

nbk 22.12.2020 19:20
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
1 685
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала начните с 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')
  );

Другие вопросы по теме