【问题标题】:SQL to retrieve multidimensional ArraySQL 检索多维数组
【发布时间】:2017-10-07 16:51:09
【问题描述】:

我正在尝试学习 SQL,但遇到了以下问题。我可以使用命令式编程轻松解决它,但想知道是否可以仅使用查询来解决此问题:

输入

Table 1 (users)

ID  | Firstname
--------------
1   | Felix
2   | Michael
3   | Tobias

Table 2 (hobbies)

ID  | Hobby     | User
------------------------
1   | cooking   | 1
2   | cat       | 1
3   | piano     | 2

想要的输出

{
    "users": [{
            "firstname": "Felix",
            "hobbies": [{
                "id": 1,
                "name": "cooking"
            }, {
                "id": 2,
                "name": "cat"
            }]
        },
        {
            "firstname": "Michael",
            "hobbies": [{
                "id": 3,
                "name": "piano"
            }]
        },
        {
            "firstname": "Tobias",
            "hobbies": []
        }
    ]
}

当然不需要直接是JSON。到目前为止,我已经通过连接为每个爱好 x 用户创建了一行(Felix 为两行)

Felix | cooking
Felix | cat
Michael | piano

或者某些信息丢失了(Felix 的猫丢失了)

Felix | cooking
Michael | piano

【问题讨论】:

标签: mysql sql arrays multidimensional-array


【解决方案1】:

第二次更新

我不喜欢这种感觉太像“蛮力”了,我猜还有更优雅的方式……

select concat('{ "users": [', group_concat(json.hobbies), '] }') as hobbies
from
(
    select concat('{"firstname": "',u.firstname,'", "hobbies": [', group_concat(json_object('id',h.id,'name',h.hobby),''), ']}') hobbies
    from users u
        left join hobbies h on u.id = h.user
    group by u.id
    order by u.firstname
) as json

输出

{ "users": [{"firstname": "Felix", "hobbies": [{"id": 1, "name": "cooking"},{"id": 2, "name": "cat"}]},{"firstname": "Michael", "hobbies": [{"id": 3, "name": "piano"}]},{"firstname": "Tobias", "hobbies": [{"id": null, "name": null}]}] }

第一次更新

我已经输掉了与 MySQL JSON 的战斗(现在)。我能得到的最接近的是以下内容,我想这可能仍然有一些用处:

select u.firstname, group_concat(json_object('id',h.id,'name',h.hobby),'') hobbies
from users u
left join hobbies h on u.id = h.user
group by u.id
order by u.firstname

输出

+-----------+-------------------------------------------------------+
| firstname | hobbies                                               | 
+-----------+-------------------------------------------------------+
| Felix     | {"id": 1, "name": "cooking"},{"id": 2, "name": "cat"} |
| Michael   | {"id": 3, "name": "piano"}                            |
| Tobias    | {"id": null, "name": null}                            | 
+-----------+-------------------------------------------------------+    

原始答案

不确定 JSON,这对于 SQL 端是否足够?

select
    u.id,
    u.firstname,
    group_concat(h.hobby ORDER BY h.ID SEPARATOR ',') as hobbies
from
    my_users u
    LEFT JOIN hobbies h ON
    u.ID = h.user
group by
    u.id,
    u.firstname

输出

+----+-----------+-------------+
| id | firstname |   hobbies   |
+----+-----------+-------------+    
|  1 | Felix     | cooking,cat |
|  2 | Michael   | piano       |
|  3 | Tobias    | NULL        |
+----+-----------+-------------+ 

【讨论】:

  • 我喜欢这个主意,但我很遗憾需要身份证
  • 它可以毫无困难地添加到爱好中,看起来(例如)像这样:1: cooking, 2: cat。如果这足够好,我会进行编辑。但与此同时,我会看看能否找到完整的 JSON 输出。我喜欢学习这些东西,所以...
  • 不太确定在什么情况下您会收到通知,但如果您还没有看到,我已经尝试从 MySQL 获取完整的 JSON 输出。它似乎运作良好,但如果没有更优雅的方法来做到这一点,我会感到惊讶。会对您的反馈感兴趣。
  • 确实,我没有收到有关编辑您答案的通知。对于我的任务,这个解决方案工作得很好。我现在的问题是,构建这种你称之为“蛮力”的非正常查询还是在检索代码中操作数据更好
  • 哦,如果它有效,我肯定会使用它。但是,如果有人有改进,请注意稍后对您的问题的其他答案。或者,您可以提出一个新问题,专门要求改进此代码。我尝试了一个更接近@a_horse_with_no_name 提供的解决方案,但它不断转义部分内部 JSON 对象,我无法在其他 JSON 函数上制作 MySQL 文档的头部或尾部。但是其他人会有更多的经验,并且知道是否有更好的方法。同时保持你的其他代码精简。
猜你喜欢
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多