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

サブクエリがMySQLで複数の行を返す場合にJSONを列データに入れる方法

    少し複雑ですが、行ごとにJSONオブジェクトを作成し、GROUP_CONCATを使用してそれらを連結することができます。 結果をキャストします([]でラップ) 配列にするために)JSONに;

    SELECT u.uid, u.username, 
      CASE WHEN p.uid IS NULL 
           THEN NULL 
           ELSE CAST(CONCAT('[',
                       GROUP_CONCAT(JSON_OBJECT('pid', p.pid,
                                                'title', p.title, 
                                                'status', p.status)),     
                     ']') AS JSON) END portfolios
    FROM user u
    LEFT JOIN portfolio p
      ON u.uid=p.uid
    WHERE p.status = 1
    GROUP BY u.uid, u.username;
    

    ...これは...

    +------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
    |    1 | manoj    | [{"pid": 1, "title": "title 1", "status": 1}, {"pid": 2, "title": "title 2", "status": 1}, {"pid": 3, "title": "title 3", "status": 1}] |
    |    2 | testing  | [{"pid": 4, "title": "title 1", "status": 1}]                                                                                           |
    |    3 | user     | NULL                                                                                                                                    |
    |    4 | company  | NULL                                                                                                                                    |
    +------+----------+-----------------------------------------------------------------------------------------------------------------------------------------+
    

    JSONをサポートしていない古いMySQLを使用している場合は、文字列として作成できます。

    SELECT u.uid, u.username, 
      CASE WHEN p.uid IS NULL
      THEN NULL 
      ELSE CONCAT('[', 
        GROUP_CONCAT(CONCAT('{ "pid":',p.pid,',"title":"', REPLACE(p.title, '"', '\\"'),
               '","status":',p.status, ' }')), ']') END portfolios
    FROM user u 
    LEFT JOIN portfolio p 
      ON u.uid=p.uid AND p.status=1
    GROUP BY u.uid, u.username;
    

    ...それはあなたに与えるでしょう...

    +------+----------+------------------------------------------------------------------------------------------------------------------------------+
    | uid  | username | portfolios                                                                                                                   |
    +------+----------+------------------------------------------------------------------------------------------------------------------------------+
    |    1 | manoj    | [{ "pid":2,"title":"title 2","status":1 },{ "pid":3,"title":"title 3","status":1 },{ "pid":1,"title":"title 1","status":1 }] |
    |    2 | testing  | [{ "pid":4,"title":"title 1","status":1 }]                                                                                   |
    |    3 | user     | NULL                                                                                                                         |
    |    4 | company  | NULL                                                                                                                         |
    +------+----------+------------------------------------------------------------------------------------------------------------------------------+
    


    1. OracleでのSQLクエリの調整

    2. 月曜日から日曜日までのmysql週

    3. PHPとMYSQLを使用してお気に入りのジョブリストを作成する

    4. JDBC-mysqlデータベースの値を取得してテーブルを削除することはできません