Сущности, связанные с запросом MySQL, из нескольких дочерних строк в массив json

Это мой дизайн базы данных с отношением "многие ко многим".

table Tournament
TournamentId int
name varchar(45)

table User
UserId int
name varchar(45)

table Tournament_Users
Tournament_Id int
User_Id int

Я пытаюсь вернуть все турниры со списком пользователей турнира в формате JSON. Я не уверен, можно ли это сделать в запросе или это задание javascript? Я пытался следовать этому Возвращение дочерних строк в формате JSON в запросах SQL Server, но я утонул в этом примере.

Это мой текущий запрос

SELECT t.TournamentId, t.Name as tourName, u.UserId, u.Name as userName
FROM  Tournament_Users tu
LEFT JOIN  Tournaments t ON tu.Tournament_Id = t.TournamentId
LEFT JOIN  Users u ON u.UserId = tu.User_Id

Сущности, связанные с запросом MySQL, из нескольких дочерних строк в массив json

Итак, в результате json это выглядит так:

Сущности, связанные с запросом MySQL, из нескольких дочерних строк в массив json

Клиенту кажется, что с этим довольно сложно работать. Как мне преобразовать его в такой формат?

Сущности, связанные с запросом MySQL, из нескольких дочерних строк в массив json

SQLFIDDLE: http://sqlfiddle.com/#!9/9bc2ebf/3

Чтобы автоматически форматировать вывод предложения FOR JSON на основе структуры оператора SELECT, укажите параметр AUTO.

Kedar Limaye 02.05.2018 13:23

Предоставьте структуры таблиц (SHOW CREATE TABLE table) и примеры данных для всех таблиц, задействованных на sqlfiddle.com .. Тогда мы сможем вам помочь ..

Raymond Nijland 02.05.2018 13:34

Спасибо, отредактировал пост @RaymondNijland

J.Kirk. 02.05.2018 13:50

Уважаемый, вы не указываете здесь имя базы данных. Я старался изо всех сил на MSSQL, но ты плохо меня замечаешь.

M Danish 03.05.2018 07:28

Я не голосовал против вас, но и в заголовке, и в теге написано mysql.

J.Kirk. 03.05.2018 10:25
Освоение архитектуры микросервисов с 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
5
1 319
2

Ответы 2

Если вы используете mysql 8.0, тогда

SELECT json_object(
'TournamentId', t.TournamentId ,'tourName', t.Name ,'UserId' ,u.UserId, 'UserName' ,u.Name)
FROM  Tournament_Users tu
LEFT JOIN  Tournaments t ON tu.Tournament_Id = t.TournamentId
LEFT JOIN  Users u ON u.UserId = tu.User_Id 

Можете сослаться -https://dev.mysql.com/doc/refman/8.0/en/json-creation-functions.html

JSON_OBJECT - это не только функция MySQL 8.0. JSON_OBJECT уже был в MySQL в 5.7
Raymond Nijland 02.05.2018 15:49

Это не дает мне желаемого формата, как на последнем изображении моего сообщения, вместо этого он просто дает мне 4 строки в формате json? Нет возможности втиснуть его в 3, чтобы у меня не было повторяющихся строк для одного и того же турнира? Спасибо за вашу помощь

J.Kirk. 02.05.2018 16:53

вы должны использовать json_array с json_object. проверьте это - stackoverflow.com/questions/37470949/…

Kedar Limaye 03.05.2018 07:04

Попробуйте что-нибудь вроде:

SELECT
  CONCAT('{"data": [', GROUP_CONCAT(`json`), ']}') `json`
FROM (
  SELECT
    JSON_OBJECT(
      'TournamentId', `t`.`TournamentId`,
      'tourName', `t`.`Name`,
      'users', JSON_ARRAYAGG(
                 JSON_OBJECT(
                   'UserId', `u`.`UserId`,
                   'userName', `u`.`Name`
                 )
               )
    ) `json`
  FROM
    `Tournament_Users` `tu`
    LEFT JOIN
      `Tournaments` `t` ON `tu`.`Tournament_Id` = `t`.`TournamentId`
    LEFT JOIN
      `Users` `u` ON `u`.`UserId` = `tu`.`User_Id`
  GROUP BY `t`.`TournamentId`, `t`.`Name`
  ORDER BY `t`.`TournamentId`
) `der`;

См. db-fiddle.

спасибо, это работает как задумано. Имейте в виду, что JSON_ARRAYAGG не был представлен до версии 5.7.22.

J.Kirk. 03.05.2018 12:34

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