MySQL从多个子行查询相关实体到json数组中

标签 mysql sql 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 作业?我试图遵循这个Returning child rows formatted as JSON in SQL Server queries但我沉浸在这个例子中。

这是我当前的查询

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

Query result

所以作为 json 结果,它看起来像这样:

Json result 1

这对于客户来说似乎很难合作。如何将其转换为这样的格式?

Json result 2

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

最佳答案

尝试如下:

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 .

关于MySQL从多个子行查询相关实体到json数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50133405/

相关文章:

sql - 加快SQLite查询的速度,我可以不使用工会吗?

php - 如何使用多种表单提交唯一数据 PHP/MySQL

java - 使用@RequestBody 将 JSON 转换为枚举类型

android使用json和rest

mysql - 从 2 个表中获取列并按日期排序

java - 在servlet中将HashMap数组转换为json对象并在jsp页面中显示

php - Mysql 将 varchar 转换为 php 日期

MySQL 自然语言搜索没有像我希望的那样工作

mysql - 如何将大型数据库从 Heroku 导入到本地 mysql 或 sqlite3?

MySql - System.Data.dll 中发生类型为 'System.InvalidOperationException' 的未处理异常