Bạn có thể lấy dữ liệu mình muốn bằng cách sử dụng JOIN
s trong truy vấn con. Nếu bạn chỉ muốn có tên, bạn có thể sử dụng:
SELECT a.id, a.title,
(SELECT JSON_ARRAYAGG(au.name)
FROM article_author aa JOIN
author au
ON au.id = aa.author_id
WHERE a.id = aa.article_id
) as authors,
(SELECT JSON_ARRAYAGG(t.tag)
FROM article_tag art JOIN
tag t
ON art.tag_id = t.id
WHERE a.id = art.article_id
) as tags
FROM article a;
Tôi không chắc bạn muốn cấu trúc dữ liệu nào với cả id và tên. Nếu bạn muốn một mảng các đối tượng JSON có hai trường trong mỗi đối tượng:
SELECT a.id, a.title,
(SELECT JSON_ARRAYAGG(JSON_OBJECT('name', au.name, 'id', au.id))
FROM article_author aa JOIN
author au
ON au.id = aa.author_id
WHERE a.id = aa.article_id
) as authors,
(SELECT JSON_ARRAYAGG(JSON_OBJECT('tag', t.tag, 'id', t.id))
FROM article_tag art JOIN
tag t
ON art.tag_id = t.id
WHERE a.id = art.article_id
) as tags
FROM article a;
Tại đây là một db <> fiddle cho phiên bản này.