#mysql
Вопрос:
У меня есть три разных стола:
- Пользователи
- Публикации
- Комментарии
И я хотел бы получить такой результат:
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.