Mysql

來自 3 個一對多表的嵌套 json 響應

  • February 15, 2017

我正在按以下方式設計數據模型:

表一:

     id:number

    somedata:String

    somedata:String

表2:

    id: number

    Table1_id: number

    somedata: String

    somedata: String

表 3:

    id: number

    Table2_id: number

    somedata: String

第一個表以一對多的關係連接到第二個表。第二個表以一對多的關係連接到第三個表。我正在使用java,JPA。我必須通過以下格式通過 rest api 返回 JSON:

{
 "table1_id": 1,
 "somedata": "somedata",
 "table2_data": [
   {
     "table2_id": 1,
     "somedata": "somedata",
     "table3_data": [
       {
         "table3_id": 1,
         "somedata": "somedata"
       },
       {
         "table3_id": 2,
         "somedata": "somedata"
       }
     ]
   },
   {
     "table2_id": 2,
     "somedata": "somedata",
     "table3_data": [
       {
         "table3_id": 3,
         "somedata": "somedata"
       },
       {
         "table3_id": 4,
         "somedata": "somedata"
       }
     ]
   }
 ]
}

如果我使用 mysql 及以上表結構,我將需要使用最少 3 個數據庫呼叫來分別從 3 個表中獲取,並且必須構造我的 json。有沒有一種方法可以減少數據庫呼叫並減少建構 json 的工作量?我也願意更改數據庫(mysql)。我只需要快速、優化和最佳的解決方案。請注意,table1、table2 和 table3 具有不同的欄位,因此我不能將它們非規範化為單個表。

我已經看過這個問題,我的問題與此不同:https ://stackoverflow.com/questions/11047151/nested-json-from-3-one-to-many-tables

在 PostgreSQL 中:

SELECT
   row_to_json (r1.*)
FROM
   (
       SELECT 
           table_1_id, 
           somedata,
           array(
               SELECT
                   row_to_json (r2.*)
               FROM
               (
               SELECT 
                       table_2_id, 
                       somedata,
                       array(
                           SELECT
                               row_to_json(r3.*, true)
                           FROM
                           (
                               SELECT
                                   table_3.table_3_id,
                                   table_3.somedata
                               FROM
                                   table_3
                               WHERE
                                   table_3.table_2_id = table_2.table_2_id
                               ORDER BY
                                   table_3_id
                           ) r3

                       ) AS table_2_data
                 FROM 
                       table_2  
                WHERE 
                       table_2.table_1_id = table_1.table_1_id 
                ORDER BY 
                       table_2_id
               ) r2
          ) AS table_2_data
       FROM 
           table_1
   ) AS r1

(有一些警告,因為你的第一級響應不是一個數組;我認為它應該)。

語法有點複雜,可以簡化

http://rextester.com/SEZ32413進行測試

引用自:https://dba.stackexchange.com/questions/164370