Можно ли получить таблицу SQL, включая внешний ключ, замененный на сериализованные данные? - PullRequest
0 голосов
/ 27 мая 2020

(скопировано из комментария)

Я использую mysql 5.7 aws aurora. - Gurebu Bokofu


Предположим, что у таких сущностей, как products:

product
--------
id | name
1  | hoge
2  | fuga

есть теги:

tag
---------
id | name
11 | tag1
22 | tag2

Чтобы знать, используется тег по продукту или сейчас, сопоставление таблицы с использованием:

map_product_tag
product_id | tag_id
1          | 11           <- product with ID 1 using tag with ID 11
1          | 22           <- product with ID 1 using tag with ID 22
2          | 22           <- product with ID 1 using tag with ID 22

Я хочу получить следующий результат по SQL запросу:

product_id | tags
             // ↓ all tags those product with ID 1 using
1          | [{ "tagId": 11, "tagName": "tag1"}, { "tagId": 22, "tagName": "tag2"}]     
             // ↓ all tags those product with ID 2 using
2          | [{ "tagId": 22, "tagName": "tag2"}]             

Если возможно, научите меня соответствующему синтаксису .

Моя база данных MySQL.

1 Ответ

2 голосов
/ 27 мая 2020
-- MySQL 8+ specific
select product.id product_id,
       json_arrayagg(json_object('tag_id', tag.id, 'tag_name', tag.name)) 
from map_product_tag
join product on map_product_tag.product_id = product.id
join tag on map_product_tag.tag_id = tag.id
group by product_id;
-- MySQL 5+ compatible
select product.id product_id,
       CONCAT('[', GROUP_CONCAT(json_object('tag_id', tag.id, 'tag_name', tag.name)), ']')
from map_product_tag
join product on map_product_tag.product_id = product.id
join tag on map_product_tag.tag_id = tag.id
group by product_id;

скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...