Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql double JOIN和GROUP上有许多关联_Mysql_Sql - Fatal编程技术网

Mysql double JOIN和GROUP上有许多关联

Mysql double JOIN和GROUP上有许多关联,mysql,sql,Mysql,Sql,我有3个模型(表): 字段: 演示文稿:id,title 演示视图:id,演示\u id 幻灯片视图:id,演示文稿\u视图\u id,持续时间 我需要一个查询来获取每个演示文稿的统计信息。统计数字如下: 每个演示文稿的PresentationView数量 所有幻灯片视图的总持续时间。属于演示文稿的幻灯片视图的持续时间(通过PresentationView) 所以基本上它看起来像双连接和双组,但是连接对我不起作用-我尝试了左/内/右双连接的每一种组合,但我无法使它起作用。我所能做的最好的事情是演

我有3个模型(表):

字段:

演示文稿:
id,title

演示视图:
id,演示\u id

幻灯片视图:
id,演示文稿\u视图\u id,持续时间

我需要一个查询来获取每个演示文稿的统计信息。统计数字如下:

  • 每个演示文稿的PresentationView数量
  • 所有幻灯片视图的总持续时间。属于演示文稿的幻灯片视图的持续时间(通过PresentationView)
  • 所以基本上它看起来像双连接和双组,但是连接对我不起作用-我尝试了左/内/右双连接的每一种组合,但我无法使它起作用。我所能做的最好的事情是演示文稿对PresentationView进行了分组,但持续时间是从只属于一个PresentationView的幻灯片视图中计算出来的,而不是演示文稿的全部视图


    如果可能,我希望避免嵌套选择。只需加入/分组

    第一件事是简单的加入和计数:

    SELECT p.id, COUNT(*)
    FROM Presentation p
    JOIN PresentationView v ON p.id = v.presentation_id
    GROUP BY p.id
    
    第二个必须使用求和(和联接):

    如果要在单个查询中同时使用这两种查询:

    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
    

    不同的原因
    : 表:

    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
    
    具有明显的:

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

    首先是一个简单的连接和计数:

    SELECT p.id, COUNT(*)
    FROM Presentation p
    JOIN PresentationView v ON p.id = v.presentation_id
    GROUP BY p.id
    
    第二个必须使用求和(和联接):

    如果要在单个查询中同时使用这两种查询:

    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
    

    不同的原因
    : 表:

    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
    
    具有明显的:

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

    与此同时,我找到了答案:

    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
    

    与此同时,我找到了答案:

    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
    

    如果你能弄清楚什么东西不适合你,用什么方式不适合你,这会有帮助。您可以使用您尝试的连接(实际查询)的至少一些组合来更新您的问题。这可能也会让你了解你在尝试中可能会犯的错误。如果你能弄清楚什么是正确的,以及以什么方式对你不起作用,这会有所帮助。您可以使用您尝试的连接(实际查询)的至少一些组合来更新您的问题。这可能也会让我们了解到你在尝试中可能会犯的错误。这种
    DISTINCT
    是毫无意义的,因为id是主键,而且本质上必须是不同的。。或者。。现在让我想想,我确信你是对的。但只有当你加入所有三个表!示例:1演示文稿有4个视图,这4个视图各有2张幻灯片。因此,在
    按演示文稿分组.id
    之后,每个
    演示文稿将被查看.id
    两次。这种
    不同的
    是没有意义的,因为id是主键,必须在本质上是不同的。。或者。。现在让我想想,我确信你是对的。但只有当你加入所有三个表!示例:1演示文稿有4个视图,这4个视图各有2张幻灯片。因此,在
    按演示文稿分组后。id
    将有每个
    演示文稿\u view.id
    两次。嘿-你的答案很好,但你缺少
    清晰的
    内部
    计数
    ->查看我的答案嘿-你的答案很好,但缺少
    清晰的
    内部
    计数
    ->查看我的答案