首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MariaDB JSON_ARRAYAGG给出错误的结果

MariaDB JSON_ARRAYAGG给出错误的结果
EN

Stack Overflow用户
提问于 2021-07-15 09:47:50
回答 1查看 153关注 0票数 0

我在使用MariaDB 15.1时遇到了两个问题

省略括号[]

不正确的结果,则值重复或省略。

我的数据库如下:

用户:

代码语言:javascript
复制
+----+------+
| id | name |
+----+------+
|  1 | Jhon |
|  2 | Bob  |
+----+------+

汽车:

代码语言:javascript
复制
+----+---------+-------------+
| id | user_id | model       |
+----+---------+-------------+
|  1 |       1 | Tesla       |
|  2 |       1 | Ferrari     |
|  3 |       2 | Lamborghini |
+----+---------+-------------+

电话:

代码语言:javascript
复制
+----+---------+----------+--------+
| id | user_id | company  | number |
+----+---------+----------+--------+
|  1 |       1 | Verzion  |      1 |
|  2 |       1 | AT&T     |      2 |
|  3 |       1 | T-Mobile |      3 |
|  4 |       2 | Sprint   |      4 |
|  5 |       1 | Sprint   |      2 |
+----+---------+----------+--------+

1.省略括号[]

例如,这个获得用户汽车列表的查询:

代码语言:javascript
复制
SELECT
  user.id   AS id,
  user.name AS name,
  JSON_ARRAYAGG(
    JSON_OBJECT(
      'id',    car.id,
      'model', car.model
    )
  ) AS cars
FROM user
INNER JOIN car ON user.id = car.user_id
GROUP BY user.id;

结果:在[]中省略了括号cars (JSON_ARRAYAGG的行为类似于GROUP_CONCAT)。

代码语言:javascript
复制
+----+------+-----------------------------------------------------------+
| id | name | cars                                                      |
+----+------+-----------------------------------------------------------+
|  1 | Jhon | {"id": 1, "model": "Tesla"},{"id": 2, "model": "Ferrari"} |
|  2 | Bob  | {"id": 3, "model": "Lamborghini"}                         |
+----+------+-----------------------------------------------------------+

但是,在添加筛选器WHERE user.id = 1时,不省略方括号[]

代码语言:javascript
复制
+----+------+-------------------------------------------------------------+
| id | name | cars                                                        |
+----+------+-------------------------------------------------------------+
|  1 | Jhon | [{"id": 1, "model": "Tesla"},{"id": 2, "model": "Ferrari"}] |
+----+------+-------------------------------------------------------------+

2.不正确的错误结果,值重复或省略。

这个错误很奇怪,因为必须满足以下条件:

  • 查阅超过2个表
  • DISTINCT选项必须使用
  • 用户至少有2辆汽车和至少3部手机。

重复值

例如,该查询获取用户的汽车列表和电话列表:

代码语言:javascript
复制
SELECT
  user.id   AS id,
  user.name AS name,
  JSON_ARRAYAGG( DISTINCT
    JSON_OBJECT(
      'id',    car.id,
      'model', car.model
    )
  ) AS cars,
  JSON_ARRAYAGG( DISTINCT
    JSON_OBJECT(
        'id',      phone.id,
        'company', phone.company,
        'number',  phone.number
    )
  ) AS phones
FROM  user
INNER JOIN car   ON user.id =   car.user_id
INNER JOIN phone ON user.id = phone.user_id
GROUP BY user.id;

我将以json格式保留输出,只留下感兴趣的元素。

结果:省略括号[],重复Verizon

代码语言:javascript
复制
{
  "id": 1,
  "name": "Jhon",
  "phones": // [ Opening bracket expected
    {
      "id": 5,
      "company": "Sprint",
      "number": 2
    },
    {
      "id": 1,
      "company": "Verzion",
      "number": 1
    },
    {
      "id": 1,
      "company": "Verzion",
      "number": 1
    }, // Duplicate object with the DISTINCT option
    {
      "id": 2,
      "company": "AT&T",
      "number": 2
    },
    {
      "id": 3,
      "company": "T-Mobile",
      "number": 3
    }
  // ] Closing bracket expected
}

省略值

如果查询中省略了phone.id,则会发生此错误。

代码语言:javascript
复制
SELECT
  user.id   AS id,
  user.name AS name,
  JSON_ARRAYAGG( DISTINCT
    JSON_OBJECT(
      'id',    car.id,
      'model', car.model
    )
  ) AS cars,
  JSON_ARRAYAGG( DISTINCT
    JSON_OBJECT(
        --'id',      phone.id,
        'company', phone.company,
        'number',  phone.number
    )
  ) AS phones
FROM  user
INNER JOIN car   ON user.id =   car.user_id
INNER JOIN phone ON user.id = phone.user_id
GROUP BY user.id;

结果:省略托槽[],省略Sprint

显然,这是因为它在JSON_OBJECT的列之间形成了OR类型,因为company存在于不同的行中,而number存在于其他的行中。

代码语言:javascript
复制
{
  "id": 1,
  "name": "Jhon",
  "phones": // [ Opening bracket expected
  //{ 
  //  "company": "Sprint",
  //  "number": 2
  //}, `Sprint` was omitted
    {
      "company": "Verzion",
      "number": 1
    },
    {
      "company": "AT&T",
      "number": 2
    },
    {
      "company": "T-Mobile",
      "number": 3
    }
  // ] Closing bracket expected
}

GROUP_CONCAT实例JSON_ARRAYAGG解决了duplicateomitted对象的问题

但是,通过添加筛选器WHERE user.id = 1,不省略方括号[],也解决了duplicateomitted对象的问题:

代码语言:javascript
复制
{
  "id": 1,
  "name": "Jhon",
  "phones": [
    {
      "id": 1,
      "company": "Verzion",
      "number": 1
    },
    {
      "id": 2,
      "company": "AT&T",
      "number": 2
    },
    {
      "id": 3,
      "company": "T-Mobile",
      "number": 3
    },
    {
      "id": 5,
      "company": "Sprint",
      "number": 2
    }
  ]
}

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-07-15 09:47:50

到目前为止,我的解决方案是这样的,但是我想使用JSON_ARRAYAGG,因为查询更干净

代码语言:javascript
复制
-- 1
SELECT
  user.id   AS id,
  user.name AS name,
  CONCAT(
    '[',
    GROUP_CONCAT( DISTINCT   
      JSON_OBJECT(
        'id',    car.id,
        'model', car.model
      )
    ),
    ']'
  ) AS cars
FROM  user
INNER JOIN car   ON user.id =   car.user_id
GROUP BY user.id;

-- 2

SELECT
  user.id   AS id,
  user.name AS name,
  CONCAT(
    '[',
    GROUP_CONCAT( DISTINCT   
      JSON_OBJECT(
        'id',    car.id,
        'model', car.model
      )
    ),
    ']'
  ) AS cars,
  CONCAT(
    '[',
    GROUP_CONCAT( DISTINCT 
      JSON_OBJECT(
          'id',      phone.id, 
          'company', phone.company,
          'number',  phone.number
      )
    ),
    ']'
  ) AS phones
FROM  user
INNER JOIN car   ON user.id =   car.user_id
INNER JOIN phone ON user.id = phone.user_id
GROUP BY user.id;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68391539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档