Как получить все сообщения в таблице с комментариями и данными автора

#mysql

Вопрос:

У меня есть три разных стола:

  1. Пользователи
  2. Публикации
  3. Комментарии

И я хотел бы получить такой результат:

 posts: [
  {
    id: 1,
    text: "Looking for something else specific here",
    author: {
      id: 3,
      image: "https://lh3.googleusercontent.com",
      username: "AR"
    },
    comments: [
      {
        id: 1,
        text: 'Try this!',
        author: {
          id: 4,
          image: "https://lh3.googleusercontent.com",
          username: "AM"
        }
      },
      {
        id: 2,
        text: 'Thanks!',
        author: {
          id: 3,
          image: "https://lh3.googleusercontent.com",
          username: "AR"
        }
      },
    ],
    created_at: "2021-08-18 01:16:58.000000",
    updated_at: "2021-08-18 01:16:58.000000"
  },
  {
    id: 2,
    text: "Looking for something specific here",
    author: {
      id: 4,
      image: "https://lh3.googleusercontent.com",
      username: "AM"
    },
    comments: [
      null
    ],
    created_at: "2021-08-18 01:18:13.000000",
    updated_at: "2021-08-18 01:18:13.000000"
  }
]
 

До сих пор у меня есть это:

 SELECT
        cast(concat('[', group_concat(
          JSON_OBJECT(
            'id', p.id,
            'text', p.text,
            'author', JSON_OBJECT(
              'id', u.id,
              'username', u.ofdb_username,
              'image', u.image
            ),
            'comments', JSON_OBJECT(
              'id', c.id,
              'text', c.text,
              'created_at', c.created_at,
              'updated_at', c.updated_at
              ),
            'created_at', p.created_at,
            'updated_at', p.updated_at
            ) SEPARATOR ','), ']') as json) as posts
      FROM posts as p
      LEFT JOIN users as u
      ON p.users_id = u.id
      LEFT JOIN comments as c
      on c.posts_id = p.id
 

Однако, если есть более одного комментария, одно и то же сообщение повторяется дважды из-за ЛЕВОГО СОЕДИНЕНИЯ. Я также не пытался присоединиться к пользователям во второй раз, чтобы получить данные об авторе комментария.

Ответ №1:

Так как я использовал Next.js, В итоге я переключился на модель ORM Prisma, которая значительно упростила это.

Я знаю, что это не прямой ответ, но для всех будущих пользователей: попробуйте отказаться от написания кода SQL и использовать ORM, такой как Prisma.