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

特定のJSON形式の親子をSQLクエリする方法は?

    MySQLから直接JSONコンテンツを生成できます。これは、MySQL5.7以降で動作するソリューションです。

    スターターとして、function<を検討します。 code> JSON_OBJECT() 、テーブル内の各レコードのJSONオブジェクトを生成します:

    SELECT 
        p.*, 
        JSON_OBJECT('id', id, 'project_name', project_name, 'parent_id', parent_id) js
    FROM tbl_projects p;
    

    サンプルデータを指定すると、次のようになります。

    | id  | project_name        | parent_id | js                                                               |
    | --- | ------------------- | --------- | ---------------------------------------------------------------- |
    | 1   | Carmichael House    | 0         | {"id": 1, "parent_id": 0, "project_name": "Carmichael House"}    |
    | 2   | Carmichael Kitchen  | 1         | {"id": 2, "parent_id": 1, "project_name": "Carmichael Kitchen"}  |
    | 3   | Carmichael Bathroom | 1         | {"id": 3, "parent_id": 1, "project_name": "Carmichael Bathroom"} |
    | 4   | Dowd Apartment      | 0         | {"id": 4, "parent_id": 0, "project_name": "Dowd Apartment"}      |
    | 5   | Dowd Kitchen        | 4         | {"id": 5, "parent_id": 4, "project_name": "Dowd Kitchen"}        |
    

    期待される出力を生成するために、自己 JOIN 子レコードを検索し、集計関数JSON_ARRAYAGG() 内部JSON配列を生成します。追加レベルの集約により、すべてが1つのオブジェクトに詰め込まれます。サンプルデータに示されているように、ルートプロジェクトには parent_id =0があると想定しました。 階層のレベルは1つだけです:

    SELECT JSON_OBJECT('projects', JSON_ARRAYAGG(js)) results
    FROM (
        SELECT JSON_OBJECT(
            'id', p.id, 
            'project_name', p.project_name, 
            'parent_id', p.parent_id,
            'children', JSON_ARRAYAGG(
                JSON_OBJECT(
                    'id', p1.id, 
                    'project_name', p1.project_name, 
                    'parent_id', p1.parent_id
                )
            )
        ) js
        FROM tbl_projects p
        LEFT JOIN tbl_projects p1 ON p.id = p1.parent_id
        WHERE p.parent_id = 0
        GROUP BY p.id, p.project_name, p.parent_id
    ) x
    

    収量:

    | results                                                                                                                                                                                                                                                                                                                                                              |
    | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | {"projects": [{"id": 1, "children": [{"id": 2, "parent_id": 1, "project_name": "Carmichael Kitchen"}, {"id": 3, "parent_id": 1, "project_name": "Carmichael Bathroom"}], "parent_id": 0, "project_name": "Carmichael House"}, {"id": 4, "children": [{"id": 5, "parent_id": 4, "project_name": "Dowd Kitchen"}], "parent_id": 0, "project_name": "Dowd Apartment"}]} |
    

    DBフィドルのデモ




    1. 空のセットを返すmysql

    2. MySQLでUTCを現地時間に変換する方法

    3. エラーの取得:「SERVER_IP」でMySQLサーバーに接続できません(99)

    4. Lumen-実行時にデータベース接続を作成します