Mysql double JOIN和GROUP上有许多关联
我有3个模型(表): 字段: 演示文稿:Mysql double JOIN和GROUP上有许多关联,mysql,sql,Mysql,Sql,我有3个模型(表): 字段: 演示文稿:id,title 演示视图:id,演示\u id 幻灯片视图:id,演示文稿\u视图\u id,持续时间 我需要一个查询来获取每个演示文稿的统计信息。统计数字如下: 每个演示文稿的PresentationView数量 所有幻灯片视图的总持续时间。属于演示文稿的幻灯片视图的持续时间(通过PresentationView) 所以基本上它看起来像双连接和双组,但是连接对我不起作用-我尝试了左/内/右双连接的每一种组合,但我无法使它起作用。我所能做的最好的事情是演
id,title
演示视图:id,演示\u id
幻灯片视图:id,演示文稿\u视图\u id,持续时间
我需要一个查询来获取每个演示文稿的统计信息。统计数字如下:
如果可能,我希望避免嵌套选择。只需加入/分组第一件事是简单的加入和计数:
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
两次。嘿-你的答案很好,但你缺少清晰的内部计数->查看我的答案嘿-你的答案很好,但缺少清晰的内部计数->查看我的答案