【问题标题】:Manipulating Javascript Object Format操作 Javascript 对象格式
【发布时间】:2020-10-11 18:13:20
【问题描述】:

我正在尝试接收某个团队下的所有玩家以及该团队的 ID。

这是我的查询:

SELECT player.team_id, team.name, player.first_name, player.last_name FROM player, team WHERE player.team_id = team.id AND player.league = "League 1";

我正在获取结果(存储在团队中)并通过以下方式将其发送给我的客户:

res.send({
        success: true,
        teams: teams
      });

这是我到达终点时返回的内容:

我想重新格式化这个日期,以便为每个独特的团队获得一个字段。它里面应该有一个球员字段(数组),所以我可以访问球队中每个球员的名字。有谁知道我如何将这些数据处理成那种格式?

因此,例如,对于这个数据集,在 teams 对象中,只有一个名为“Warriors”的字段,其中包含包含所有这些人的名字的 player 数组。

我尝试按照答案进行操作,但现在它只是将其作为字符串返回,而不是实际对象。

【问题讨论】:

    标签: javascript sql json select mariadb


    【解决方案1】:

    你可以使用聚合和json函数:

    select
        t.team_id,
        t.name,
        json_array_agg(
            json_object('first_name', p.first_name, 'last_name', p.last_name)
        ) as players
    from teams t
    inner join players p on p.team_id = t.team_id
    group by t.team_id, t.name
    

    结果集中的第三列是一个 json 数组,其中包含代表玩家的 json 对象,键为 first_namelast_name

    您还可以将整个结果集聚合为一个 json 数组,并具有另一个级别的聚合:

    select json_array_agg(
        json_object('team_id', team_id, 'name', name, 'players', players) 
    ) res
    from (
        select
            t.team_id,
            t.name,
            json_array_agg(
                json_object('first_name', p.first_name, 'last_name', p.last_name)
            ) as players
        from teams t
        inner join players p on p.team_id = t.team_id
        group by t.team_id, t.name
    ) t
    

    编辑json_array_agg() 仅从 10.5.0 版本开始可用。在早期版本中,另一种方法是字符串连接:

    select
        t.team_id,
        t.name,
        concat(
            '[',
            group_concat(json_object('first_name', p.first_name, 'last_name', p.last_name)),
            ']'
        ) as players
    from teams t
    inner join players p on p.team_id = t.team_id
    group by t.team_id, t.name
    

    【讨论】:

    • 出现错误。我相信我的 MySQL 是基于 MariaDB 的。得到这个:#1064 - 你的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在第 3 行的 '.name, JSON_ARRAYAGG( JSON_OBJECT('first_name', p.first_name, 'las' 附近使用的正确语法
    • @legit98:缺少逗号...已修复。
    • 立即获取 - FUNCTION db.JSON_ARRAYAGG 不存在。我也尝试使用您提供的功能。我可能需要更新我的 MySQL 版本。有没有其他的方式来完成重组?而不是更新。
    • @legit98: 你运行的是哪个版本? select version() 会告诉你的。
    • 10.4.11-MariaDB
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多