1

私は3つのモデル(テーブル)を持っています:

Presentation hasMany PresentationView hasMany SlideView

田畑:

プレゼンテーション:id, title

プレゼンテーション ビュー:id, presentation_id

スライドビュー:id, presentation_view_id, duration

各プレゼンテーションの統計を取得するためのクエリが必要です。統計は次のとおりです。

  1. 各プレゼンテーションあたりの PresentationView の数
  2. プレゼンテーションに属するスライド ビューからのすべての SlideView.duration の合計時間 (PresentationView を介して)

したがって、基本的には二重結合と二重グループのように見えますが、結合は機能しません-左/内側/右二重結合のすべての組み合わせを試しましたが、機能しません。私が持っていた最高のものは、PresentationがPresentationViewをグループ化していたことでしたが、期間はPresentationのすべてではなく、1つのPresentationViewに属していたSlideViewから合計されました...

可能であれば、ネストされた SELECT を避けたいと思います。JOIN/GROUPするだけ

4

2 に答える 2

1

最初は単純な JOIN と COUNT です。

SELECT p.id, COUNT(*)
FROM Presentation p
JOIN PresentationView v ON p.id = v.presentation_id
GROUP BY p.id

2 つ目は、SUM (および JOIN) を使用する必要があります。

SELECT p.id, SUM(s.duration)
FROM Presentation p
JOIN PresentationView v ON p.id = v.presentation_id
JOIN SlideView s ON v.id = s.presentation_view_id
GROUP BY p.id

1 つのクエリで両方が必要な場合:

SELECT p.id, SUM(s.duration), COUNT(DISTINCT v.id)
FROM Presentation p
JOIN PresentationView v ON p.id = v.presentation_id
JOIN SlideView s ON v.id = s.presentation_view_id
GROUP BY p.id

理由DISTINCT:

テーブル:

Presentation:    PresentationView:          SlideView:
p.id | title     v.id | presentation_id     s.id | presentation_view_id | duration
1    | abc       1    | 1                   1    | 1                    | 100
2    | xyz       2    | 1                   2    | 1                    | 150
                 3    | 1                   3    | 2                    | 200
                 4    | 1                   4    | 2                    | 250
                 5    | 1                   5    | 3                    | 300
                 6    | 2                   6    | 3                    | 400
                 7    | 2                   7    | 4                    | 500
                                            8    | 5                    | 600
                                            9    | 6                    | 100
                                            10   | 6                    | 200
                                            11   | 7                    | 350

グループの前の結果セットの例:

p.id | v.id | s.id | s.duration
-------------------------------
1    | 1    | 1    | 100
1    | 1    | 2    | 150
1    | 2    | 3    | 200
1    | 2    | 4    | 250
1    | 3    | 5    | 300
1    | 3    | 6    | 400
1    | 4    | 7    | 500
1    | 5    | 8    | 600
2    | 6    | 9    | 100
2    | 6    | 10   | 200
2    | 7    | 11   | 350

明確なグループの後で:

p.id | SUM | COUNT
------------------
1    | 8   | 2500
2    | 3   | 650

明確に:

p.id | SUM | COUNT
------------------
1    | 5   | 2500
2    | 2   | 650
于 2013-03-03T23:18:22.993 に答える
0

その間に私は答えを見つけました:

SELECT presentations.title, SUM(slide_views.duration), COUNT(DISTINCT presentation_views.id) 
FROM presentations 
LEFT JOIN presentation_views ON presentations.id = presentation_views.presentation_id 
LEFT JOIN slide_views ON presentation_views.id = slide_views.presentation_view_id 
GROUP BY presentations.id
于 2013-03-03T23:28:10.437 に答える