【问题标题】:Single mysql select on join tables to a json hierarchical fragment, how?将表连接到json分层片段的单个mysql选择,如何?
【发布时间】:2012-10-07 00:49:49
【问题描述】:

单个 MySQL 选择查询中检索两个连接表中的所有信息的最佳和最优雅的方法是什么,但以分层方式?

我有这两张桌子:

-----------------         ------------------
| Table COMPANY |         | Table EMPLOYEE |
-----------------         ------------------
| id            |         | id             |
| companyName   |         | companyId      |
-----------------         | employeeName   |
                          ------------------

(for each company, many employees)

我想输出以下分层 JSON 片段:

[
    {"id": 1,
     "companyName": "Company A",
     "employees": [
         {"id": 1, "employeeName": "Employee 1"},
         {"id": 2, "employeeName": "Employee 2"}
    ]},
    {"id": 2,
     "companyName": "Company B",
     "employees": [
         {"id": 3, "employeeName": "Employee 3"},
         {"id": 4, "employeeName": "Employee 4"}
    ]}
]

“解决方案”1:

对连接的表进行全选,并在创建 json 片段后编写一些代码:

select * from company, employee where employee.companyId = company.id;

问题:我留下了很多丑陋的 foreach 类型代码来创建 json 片段

“解决方案”2:

将所有员工按公司分组在一个 json 字符串中:

select company.id, company.name,
   concat('[',
      group_concat('{"id": ', employee.id, ',
         "employeeName": "', employee.employeeName,'"}'), ']') as employees
from company, employee where company.id = employee.companyId
group by company.id

这里,“employees”已经是一个json片段了,我只需要jsonify company.id和name即可。 但是在 mysql 中构建 json 片段似乎是非常糟糕的做法。

任何见解或其他解决方案?

非常感谢

【问题讨论】:

  • “我留下了很多丑陋的 foreach 类型代码来创建 json 片段”您使用哪种编程语言将 MySQL 结果转换为 JSON?
  • 我使用的是 java,Apache Common DbUtils 用于数据库访问,Google Gson 用于 JSON。

标签: mysql sql json hierarchical


【解决方案1】:

我可能会使用像您的解决方案 1 这样的查询,只需添加“按 company.id 排序”,然后在表中循环一次,为每一行建立一个数据结构,如果公司相同的话和上一个一样,将员工数据推送到公司,否则,定义新公司并开始使用它来推送员工数据。

像 Carlos Quijano 一样,我在这里看不到任何 foreach 混乱。 (但使用 sort by 会更容易处理)

【讨论】:

    【解决方案2】:

    因为您需要运行单个 MySQL 查询并且不想使用难看的 for-each-type 代码,所以您可能应该返回一个 no-hierarchical JSON 结果,您可以通过将查询结果序列化为使用 DbUtils 查询的集合来为您的代码添加一些优雅。

    QueryRunner run = new QueryRunner(dataSource);

    // Use the BeanListHandler implementation to convert all
    // ResultSet rows into a List of Employees JavaBeans.
    ResultSetHandler<List<Employee>> handler = new BeanListHandler<Employee>(Employee.class);
    
    // Execute the SQL statement and return the results in a List of
    // Person objects generated by the BeanListHandler.
    List<Employee> employees = run.query("SELECT * FROM EMPLOYEE ORDER BY COMPANY_ID", handler);
    

    但如果您需要生成分层 JSON 结果,我同意下面 MortenSickel 的回答,使用类型化的 foreach 减少该集合,最后使用 GSON 进行 JSON 编码,我认为绝对没有问题那个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多