sql >> データベース >  >> RDS >> Mysql

MySQL1対多からJSON形式

    要件を満たす可能性のあるSQLクエリを次に示します。 MySQL JSON_ARRAYAGG()集計関数 JSONオブジェクトの配列を生成します( JSON_OBJECT() )。

    salesを生成するために、結合内で中間レベルのグループ化が実行されます。 各ユーザーのJSON配列。次に、結果は1行に集約され、1つの列には結果のオブジェクトのJSON配列が含まれます。

    SELECT
      JSON_ARRAYAGG(JSON_OBJECT('id', u.id, 'name', u.name, 'sales', s.sales))
    FROM
        user u
        LEFT JOIN (
            SELECT 
                user, 
                JSON_ARRAYAGG(JSON_OBJECT('id', id, 'item', item)) sales 
            FROM sale 
            GROUP BY user
        ) s ON s.user = u.id
    

    DBフィドルのデモ

    戻り値をJSON_PRETTYでラップした場合 、出力は次のとおりです:

    [
      {
        "id": 1,
        "name": "User 1",
        "sales": [
          {
            "id": 1,
            "item": "t-shirt"
          },
          {
            "id": 2,
            "item": "jeans"
          }
        ]
      },
      {
        "id": 2,
        "name": "User 2",
        "sales": [
          {
            "id": 3,
            "item": "sweatpants"
          },
          {
            "id": 4,
            "item": "gloves"
          }
        ]
      }
    ]
    

    編集 :これは、JSONサポートが利用できないMySQL <5.7の(醜い)ソリューションです。文字列操作関数のみに依存します。これは、varcharフィールドに"が含まれていない場合にのみ機能することに注意してください。 文字:

    SELECT
        CONCAT(
            '[', 
            GROUP_CONCAT( CONCAT( '{ "id":', u.id, ', "name":"', u.name, '", "sales":', s.sales, ' }' )  SEPARATOR ', ' ),
            ']'
        )
    FROM 
        user u
        LEFT JOIN (
            SELECT 
                user, 
                CONCAT( 
                   '[', 
                    GROUP_CONCAT( CONCAT( '{ "id":', id, ', "item":"', item, '" }' ) SEPARATOR ', '),
                    ']'
                ) sales 
        FROM sale
        GROUP BY user ) s ON s.user = u.id
    

    DBフィドルのデモ




    1. Oracleデータベースとは何ですか?

    2. T-SQLで2つの日時の差を計算する方法

    3. ループ中のPHPget_resultが機能しない

    4. SQL ServerでのDATEPART()の例