私は多数の MySQL JSON ドキュメント ストア風のクエリを正常に完了しましたが、現在、私の専門知識の範囲を超えた非常に複雑なクエリを作成する段階に来ています。どんな助けでも大歓迎です。
目標: このナビゲーション ツリーをレンダリングできるようにする MySQL からの json フィードを作成するには:
作成手順:
この SQL スクリプトをインストールします: https://implerus.com/st_overflow/profile.sql
そして、次の SQL スクリプトをインストールします: https://implerus.com/st_overflow/oscal_rev5.sql
これにより、「profiles」と「oscal_rev5」の 2 つのテーブルが作成され、json データが各テーブルの「json_data」列に配置されます。
これらの json_data 列に取り込まれている json データを簡単に確認したい場合は、次のデータを参照してください。
https://www.implerus.com/st_overflow/profile_data.json
https://www.implerus.com/st_overflow/OSCAL_Rev5_Latest.json
だから、ここに目標があります:
- プロファイル (json_data) テーブルから "control-id" を取得する mySQL JSON クエリを作成します。「ac-1」、「ac-2」、「ac-3」、「ac-6.7」、「ac-6.9」、「ac-7」などを返す必要があります。
機能すると思われるクエリをお見せできますが、機能しません。
SELECT control.controlid FROM profiles, JSON_TABLE(json_data, '$.profile.imports.include."id-selectors[*]"' COLUMNS (controlid VARCHAR(10) PATH '$."control-id"')) control
それから結果が返されず、その理由がわかりません。パスとハイフンを使用した二重引用符に関係があると思われますが、私が読んだことから、それがハイフンを使用したクエリをサポートする方法です。
- 次に、何らかの方法でこれらのエントリを oscal_rev5 json_data と左結合して、「ac-1」、「ac-2」、「ac-3」、「ac-6.7」などの値のすべてのタイトルを取得し、データを json として返すので、これ (この場合は ReactJS) は、上記のナビゲーション ツリーを Bootstrap アコーディオンとして描画できます。そのため、クエリはナビゲーションのレベル 1 の部分 (「アクセス制御」、「認識とトレーニング」、「監査と説明責任」など) を、上記のステップ 1 から発生した「子」ノードと共に返す必要があります。
「親ノード」リストを取得する作業クエリがあります。
SELECT grouplist.id, grouplist.title FROM oscal_rev5, JSON_TABLE(json_data, '$.catalog.groups[*]' COLUMNS (id VARCHAR(140) PATH '$.id',class VARCHAR(20) PATH '$.class',title VARCHAR(80) PATH '$.title')) grouplist
そして、サブ親コントロールリストを返す試みに失敗しました:
SELECT grouplist.id, grouplist.title FROM oscal_rev5, JSON_TABLE(json_data, '$.catalog.groups.controls[*]' COLUMNS (id VARCHAR(140) PATH '$.id',class VARCHAR(20) PATH '$.class',title VARCHAR(80) PATH '$.title')) grouplist
何も返しません。理由はわかりません。「$.catalog.groups.controls[*]」で id、class、title データを取得するには、パス内のノードをたたくだけでうまくいくと思うかもしれませんが、エラーなしで失敗します。
OSCAL データで、"groups"->"controls"->"id": "ac-1" には "Policy and Procedures" というタイトルがあることに注意してください。そして、"groups"->"controls"->"id": "ac-2" のタイトルが "Account Management" になっていることに注意してください。また、"groups"->"controls"->"id": "ac-6.7" のタイトルが "Review of User Privilages" になっていることに注意してください。これで、ナビゲーション ツリーのレベル 2 に返される適切なデータがすべて揃いました。
「ac-1」、「ac-2」、「ac-6.7」などのエントリはすべて「ac」で始まるため、すべて「親」の「ac」ノードの下にラップする必要があります。ノード、同じ oscal json データによると、「アクセス制御」と呼ばれるタイトルがあります。同様に、「at」で始まるステップ 1 から返されたすべての値は、結果の「認識とトレーニング」の親に分類される必要があります。
- 次に、「アクセス制御」、「認識とトレーニング」、「監査と説明責任」などに該当する nav-tree 内のすべての subnav 要素を何らかの方法で count() し、そのデータを mySQL 結果内に提供します。
したがって、大きな問題は、3 つのステップすべてを 1 つの mySQL JSON クエリに結合し、親 nav ノードとその子を区別する 1 セットの結果を取得して、後で次のように出力できるようにする方法があるかどうかです。 JSON であり、ナビゲーション ツリー UI を駆動するために使用されます。