MySQL按总和问题连接表组

MySQL按总和问题连接表组,mysql,join,group-by,sum,Mysql,Join,Group By,Sum,我在连接表时遇到问题,以下是示例表: 表A:(30行) ╔════╦════════════╦═════════════╗ ║ 身份证件║ 名称║ 描述║ ╠════╬════════════╬═════════════╣ ║ 1.║ 类型║ Unicode艺术║ ║ 2.║ 标题║ 电子表格║ ║ 3.║ 自动对齐║ 关║ ╚════╩════════════╩═════════════╝ 表B:(100行) ╔════╦════════════╦═════════════╦═════════

我在连接表时遇到问题,以下是示例表:

表A:(30行)

╔════╦════════════╦═════════════╗ ║ 身份证件║ 名称║ 描述║ ╠════╬════════════╬═════════════╣ ║ 1.║ 类型║ Unicode艺术║ ║ 2.║ 标题║ 电子表格║ ║ 3.║ 自动对齐║ 关║ ╚════╩════════════╩═════════════╝ 表B:(100行)

╔════╦════════════╦═════════════╦═════════╗ ║ 身份证件║ 名称║ 描述║ 表║ ╠════╬════════════╬═════════════╬═════════╣ ║ 1.║ 类型║ Unicode艺术║ 1.║ ║ 2.║ 标题║ 电子表格║ 1.║ ║ 3.║ 自动对齐║ 关║ 2.║ ╚════╩════════════╩═════════════╩═════════╝ 表C:(8000行)

╔════╦════════════╦═════════════╦═════════╗ ║ 身份证件║ 文章║ 正文║ 表B║ ╠════╬════════════╬═════════════╬═════════╣ ║ 1.║ 类型║ Unicode艺术║ 1.║ ║ 2.║ 标题║ 电子表格║ 1.║ ║ 3.║ 自动对齐║ 关║ 2.║ ╚════╩════════════╩═════════════╩═════════╝ 表D:(100000行和计数)

╔════╦═══════════╦════════════╦═════════════╦═════════╗ ║ 身份证件║ 日期║ 咔哒声║ 印象║ 表C║ ╠════╬═══════════╬════════════╬═════════════╬═════════╣ ║ 1.║ 20120814║ 10║ 3.║ 1.║ ║ 2.║ 20120815║ 13║ 5.║ 1.║ ║ 3.║ 20120816║ 15║ 10║ 2.║ ╚════╩═══════════╩════════════╩═════════════╩═════════╝ 表E:(200000行和计数)

╔════╦═══════════╦════════════╦═══════════╦═════════╗ ║ 身份证件║ 日期║ 意见║ 来访者║ 表C║ ╠════╬═══════════╬════════════╬═══════════╬═════════╣ ║ 1.║ 20120814║ 10║ 3.║ 1.║ ║ 2.║ 20120815║ 13║ 5.║ 1.║ ║ 3.║ 20120816║ 15║ 10║ 2.║ ║ 4.║ 20120817║ 8.║ 7.║ 2.║ ║ 5.║ 20120818║ 9║ 4.║ 2.║ ╚════╩═══════════╩════════════╩═══════════╩═════════╝ 我使用单个sql语句查询此表:

SELECT A.name, A.Description, SUM(D.clicks), SUM(D.Impressions), SUM(E.Views), SUM(E.Visitors) FROM A LEFT JOIN B ON A.ID=B.TableA LEFT JOIN C ON B.ID=C.TableB LEFT JOIN D ON C.ID=D.TableC LEFT JOIN E ON C.ID=E.TableC GROUP BY A.ID 挑选 名字, A.说明, 总数(D.c.), 总数(D.D.), 总和(即视图), 总数(如访客) 从…起 A. 左连接B 在A.ID=B.table上 左连接C 关于B.ID=C.TableB 左连接D 关于C.ID=D.TableC 左连接E 关于C.ID=E.TableC 分组 身份证 问题是查询返回的表D和表E的总和无效
但是,如果在双查询中查询表D和表E,我会得到正确的值:

SELECT A.name, A.Description, SUM(D.clicks), SUM(D.Impressions) FROM A LEFT JOIN B ON A.ID=B.TableA LEFT JOIN C ON B.ID=C.TableB LEFT JOIN D ON C.ID=D.TableC GROUP BY A.ID 挑选 名字, A.说明, 总数(D.c.), 总数(D.1) 从…起 A. 左连接B 在A.ID=B.table上 左连接C 关于B.ID=C.TableB 左连接D 关于C.ID=D.TableC 分组 身份证 编辑1:
我试过右连接、连接、左外连接,但都不起作用,
当然,我可能在错误的地方使用了它们。
但在我得到“所有包含”值的第一个语句中,值是相乘的
比实际高出数千倍。


表D和表E都通过表C链接到其余部分。因此,您的第一个查询给出了表D中所有行乘以表E中所有行的笛卡尔乘积,求和函数聚合了该笛卡尔乘积。可能您还需要按表C分组,而不仅仅是按表A分组。

您需要同时展平D和E表。那么我假设A和B只是C的查找,所以不需要对A进行分组:

我去掉了杂音(A和B),因为我还看不到A和B与总结C的信息有什么关系

试试这个:

SELECT
       C.Article,
       C.Text,

       COALESCE(D.ClicksSum,0) AS ClicksSum,
       COALESCE(D.ImpressionsSum,0) AS ImpressionsSum,

       COALESCE(E.ViewsSum,0) AS ViewsSum,
       COALESCE(E.VisitorsSum,0) AS VisitorsSum
FROM 
       C

       LEFT JOIN 
       (
         SELECT TableC, SUM(Clicks) AS ClicksSum, SUM(Impressions) AS ImpressionsSum
         FROM D
         GROUP BY TableC
       ) D ON C.ID=D.TableC

       LEFT JOIN 
       (
         SELECT TableC, SUM(Views) AS ViewsSum, SUM(Visitors) AS VisitorsSum
         FROM E
         GROUP BY TableC       
       ) E ON C.ID=E.TableC
输出:

|    ARTICLE |        TEXT | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        23 |              8 |       23 |           8 |
|     Header | Spreadsheet |        15 |             10 |       32 |          21 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |
|       NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        38 |             18 |       55 |          29 |
|     Header | Spreadsheet |         0 |              0 |        0 |           0 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |
|       NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        38 |             18 |       55 |          29 |
|     Header | Spreadsheet |         0 |              0 |        0 |           0 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |
请注意,我并没有在SQLFIDLE帖子中手动键入这些模式,而是使用SQLFIDLE的文本进行DDL

我喜欢,它的文本到DDL甚至可以解析出ASCII艺术中的数据ツ


在看到你更明确的目标后(从你的评论中),这可能是:

输出:

|    ARTICLE |        TEXT | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        23 |              8 |       23 |           8 |
|     Header | Spreadsheet |        15 |             10 |       32 |          21 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |
|       NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        38 |             18 |       55 |          29 |
|     Header | Spreadsheet |         0 |              0 |        0 |           0 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |
|       NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        38 |             18 |       55 |          29 |
|     Header | Spreadsheet |         0 |              0 |        0 |           0 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |

上述方法可能仍会产生笛卡尔积,在将子类别(B)分组到类别(A)之前将其展平:

输出:

|    ARTICLE |        TEXT | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        23 |              8 |       23 |           8 |
|     Header | Spreadsheet |        15 |             10 |       32 |          21 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |
|       NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        38 |             18 |       55 |          29 |
|     Header | Spreadsheet |         0 |              0 |        0 |           0 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |
|       NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        38 |             18 |       55 |          29 |
|     Header | Spreadsheet |         0 |              0 |        0 |           0 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |

没有读过你的问题,但是+1代表桌面艺术。B和A有什么关系?同样,对于C到B,我也想到了这一点,但随后查询返回表A的值的次数与Ta中表A的数据的次数相同
|       NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
|       Type | Unicode Art |        38 |             18 |       55 |          29 |
|     Header | Spreadsheet |         0 |              0 |        0 |           0 |
| Auto Align |         Off |         0 |              0 |        0 |           0 |