2016-07-11 9 views
0

私は、次のしているデータ階層: レポート>は、多くのインスタンスを持っている....各インスタンスは(カテゴリの有限しかし、未知の量)のMySQL - 孫のカテゴリ集計

それに割り当てられた別のカテゴリがあるかもしれません>多くのモジュールを持っています私は、インスタンスのカテゴリのレポートレベルの集計を作成する必要があります...このような何か:

| report_id | category |  #  | 
|   1 |   1 |   10| 
|   1 |   2 |   5 | 
|   2 |   7 |   2 | 
|   2 |   4 |   14| 

私は、MySQLに新しいですし、私は次のことを試してみました:

mysql> SELECT report_id.report_id, module_id.module_id, instance.instance_id, violation.name 
-> FROM report_id 
-> LEFT JOIN module_id 
-> ON report_id.report_id=module_id.report_id 
-> LEFT JOIN instance 
-> ON module_id.module_id = instance.module_id 
-> LEFT JOIN violation 
-> ON instance.violation_id = violation.violation_id 
-> ORDER BY report_id.report_id 
-> ; 
製造するため

mysql> SELECT violation.name as Category, COUNT(instance.instance_id) AS NumberOfViolations FROM instance 
-> LEFT JOIN violation 
-> ON instance.violation_id=violation.violation_id 
-> GROUP BY name; 

+----------------+--------------------+ 
| Category  | NumberOfViolations | 
+----------------+--------------------+ 
| 1    |     2 | 
| 2    |     1 | 
| 3    |     3 | 
+----------------+--------------------+ 

をしかし、これは、すべての孫の総カテゴリ数を返します。

+-----------+-----------+-------------+----------------+ 
| report_id | module_id | instance_id | category  | 
+-----------+-----------+-------------+----------------+ 
|   1 |   1 |   1 | 1    | 
|   1 |   2 |   5 | 1    | 
|   1 |   1 |   2 | 2    | 
|   1 |   1 |   3 | 3    | 
|   1 |   1 |   4 | 3    | 
|   1 |   3 |   6 | 3    | 
|   2 |  NULL |  NULL | NULL   | 
|   3 |  NULL |  NULL | NULL   | 
+-----------+-----------+-------------+----------------+ 

私も試してみました。 (現在、これらの合計をトップレベルのレポートグループで区切る必要があります)

私は、これらの2つのクエリと結びついて正しい表を作成するのに問題があります。どのように進むべきかについての手がかりが役に立つでしょう。

レポートのIDがモジュールのIDとモジュールのIDが一致したインスタンスIDが一致しているのに、このネストされた構造を組み込む方法がわからない場合は、SUMを導入する必要があることがわかりました。

+0

あなたは多くの/いくつかのフィールドでグループ化することができます。 –

+0

大きなヒント...私はそれを今遊んでいます...フォローアップをポストする予定です。だから、Jon Snowのように、私は何も知らない)。 – eMTy

答えて

0

グループ化についてのコメントをしてくれたMarc Bさん、ありがとうございました。これは必要なものです。

mysql> SELECT report_id.report_id, violation.name as Category, COUNT(instance.instance_id) AS NumberOfViolations FROM instance 
-> LEFT JOIN violation 
-> ON instance.violation_id=violation.violation_id 
-> LEFT JOIN module_id 
-> ON instance.module_id = module_id.module_id 
-> LEFT JOIN report_id 
-> ON module_id.report_id = report_id.report_id 
-> GROUP BY report_id, violation.name; 

私はまだ上位report_idsに(violation_idsを保持)インスタンスに参加するMODULE_IDを使用していますが、私はの一部としてMODULE_ID使用していないか注意してください。

これは、結果のクエリは次のようになりますSELECTステートメントを使用すると、出力はその列をスキップして、レポートレベルのカテゴリ集計を表示するだけです。以下の出力:

+-----------+----------------+--------------------+ 
| report_id | Category  | NumberOfViolations | 
+-----------+----------------+--------------------+ 
|   1 | 1    |     2 | 
|   1 | 2    |     1 | 
|   1 | 3    |     3 | 
|   2 | 2    |     10| 
+-----------+----------------+--------------------+