是否有可能使用mysql脚本获取列表对象的数据?

时间:2018-12-28 14:47:54

标签: mysql

有一个json查询,可为我提供人和宠物联接表的json:

SELECT 
    json_object(
        'personId', p.id,
        'firstPetName', p.firstPetName,
        'pets', json_arrayagg(
                   json_object(
                   'petId', pt.id,
                   'petName', pt.name
                  )
                 )
                )
     FROM person p
     LEFT JOIN pets pt ON p.id = pt.person_id
     GROUP BY p.id;

我想添加一个条件,如果p.firstPetName为空或空字符串以将第一只宠物的pt.petName放入宠物列表,这可能吗?

示例:

如果这是结果:

{
  "personId": 1,
  "firstPetName": null // or ""
  "pets": [
    {
      "petName": "walker"
    },
    {
      "petName": "roxi"
    }
  ]
}

我想得到:

{
  "personId": 1,
  "firstPetName": "walker"
  "pets": [
    {
      "petName": "walker"
    },
    {
      "petName": "roxi"
    }
  ]
}

如果可以做类似pt[0].petName的事情,那就太好了

1 个答案:

答案 0 :(得分:1)

来自mysql documentation

  

JSON_ARRAYAGG(col_or_expr) [over_clause]

     

将结果集聚合为单个JSON数组,其元素由行组成。 该数组中元素的顺序未定义

因此,在您的用例中,未定义列表中宠物的顺序。您无法确定哪个宠物会首先出现在json_arrayagg调用生成的json数组中。

以下查询给出的答案默认为带有最小名称的pet。然后使用COALESCE函数为p.firstPetName提供默认值。

SELECT 
    json_object(
        'personId', p.id,
        'firstPetName', COALESCE(p.firstPetName, MIN(pt.name))
        'pets', json_arrayagg(
            json_object(
                'petId', pt.id,
                'petName', pt.name
            )
        )
    )
FROM 
    person p
    LEFT JOIN pets pt ON p.id = pt.person_id
GROUP BY p.id;