mysql - 在 hasMany 关联上双重 JOIN 和 GROUP

标签 mysql sql

我有 3 个模型(表):

Presentation hasMany PresentationView hasMany SlideView

字段:

演示文稿:id, title

PresentationView:id, presentation_id

SlideView:id, presentation_view_id, duration

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

  1. 每个 Presentation 的 PresentationView 数量
  2. 属于 Presentation 的幻灯片 View (通过 PresentationView)的所有 SlideView.duration 的总持续时间

所以基本上它看起来像双 JOIN 和双 GROUP 但连接对我不起作用 - 我尝试了 LEFT/INNER/RIGHT 双连接的所有组合,但我无法使其工作。我拥有的最好的是 Presentation 已将 PresentationView 分组,但持续时间仅来自 SlideViews SUMed 仅属于一个 PresentationViews 而不是全部用于 Presentation...

如果可能,我想避免嵌套的 SELECT。加入/组

最佳答案

首先是简单的 JOIN 和 COUNT:

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

第二个必须使用 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

如果你想在一个查询中同时使用:

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

关于mysql - 在 hasMany 关联上双重 JOIN 和 GROUP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15191986/

相关文章:

sql - 使用GROUP BY执行SELECT的更好方法

sql - 需要从日期范围中获取月份

mysql - SQL 查询多次返回 group_concat 函数中的标签字段

mysql - 类似服务数据库的组织方式

php - 我如何从 chrome 扩展中安全地更新远程数据库?

mysql - 如果与字符串 sql 不同则选择

mysql - 多对多关系mysql设计

sql - 在 Hive SQL 中引用计算列的输出

mysql - Haproxy根据请求中的域名对Mysql连接进行负载均衡

java - 在 IDE Netbeans 中从 java 连接到 MySQL 数据库