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

表A:(30行)

╔════╦════════════╦═════════════╗
║ID║名称║描述║
╠════╬════════════╬═════════════╣
║1║类型║Unicode艺术║
║2║ header ║电子表格║
║3║自动对齐║关║
╚════牛皮════════════牛皮═════════════╝

表B:(100行)

╔════╦════════════╦═════════════╦═════════╗
║ID║名称║描述║TableA║
╠════╬════════════╬═════════════╬═════════╣
║1║类型║Unicode艺术║1║
║2║ header ║电子表格║1║
║3║自动对齐║关║2║
╚════牛皮════════════牛皮═════════════牛皮═════════════

表C :( 8000行)

╔════╦════════════╦═════════════╦═════════╗
║ID║文章║文本║TableB║
╠════╬════════════╬═════════════╬═════════╣
║1║类型║Unicode艺术║1║
║2║ header ║电子表格║1║
║3║自动对齐║关║2║
╚════牛皮════════════牛皮═════════════牛皮═════════════

表D:(100 000行并在计数)

╔════╦═══════════╦════════════╦═════════════╦═════ ════╗
║ID║日期║点击║印象║TableC║
╠════╬═══════════╬════════════╬═════════════╬═════ ════╣
║1║20120814║10║3║1║
║2║20120815║13║5║1║
║3║20120816║15║10║2║
╚════牛皮═══════════牛皮════════════牛皮════════════牛皮═════ ════╝

表E:(200 000行并在计数)

╔════╦═══════════╦════════════╦═══════════╦═══════ ══╗
║ID║日期s View ║访客║TableC║
╠════╬═══════════╬════════════╬═══════════╬═══════ ══╣
║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语句查询此表:

选择
一个名字,
说明,
SUM(D.clicks),
SUM(D.Impressions),
SUM(E.Views),
总和(E.Visitors)

一种
左联接B
开启A.ID = B.TableA
左联接C
在B.ID = C.TableB
左联接D
在C.ID = D.TableC
左联接E
在C.ID = E.TableC
通过...分组
援助

问题是查询返回表D和表E的无效SUM
但是,如果在单个查询中查询表D和表E,我会得到正确的值:

选择
一个名字,
说明,
SUM(D.clicks),
SUM(D。印象数)

一种
左联接B
开启A.ID = B.TableA
左联接C
在B.ID = C.TableB
左联接D
在C.ID = D.TableC
通过...分组
援助

编辑1:
我尝试过RIGHT JOIN,JOIN,LEFT OUTER JOIN,但没有一个起作用,
当然,我可能在错误的地方使用了它们。
但是在我得到“全部包含”的第一个语句中,值相乘
比实际高出数千倍

最佳答案

您需要展平D和E表。然后,我假设A和B只是对C的查找,因此不需要对A进行GROUP BY:http://www.sqlfiddle.com/#!2/fccf1/8

我删除了噪声(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 |

请注意,我没有在sqlfiddle帖子中手动键入这些架构,而是使用sqlfiddle的文本转换为DDL

我喜欢http://sqlfiddle.com,它的到DDL的文本甚至可以解析ASCII艺术作品中的数据ツ

看到更清晰的目标时(根据您的评论),可能是:http://www.sqlfiddle.com/#!2/fccf1/13
SELECT
       A.Name, A.Description,

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

       COALESCE(SUM(E.ViewsSum),0) AS ViewsSum,
       COALESCE(SUM(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

       RIGHT JOIN B ON B.ID = C.TableB
       RIGHT JOIN A ON A.ID = B.TableA

GROUP BY A.ID

输出:
|       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 |

上面的方法可能仍然会产生笛卡尔积,将SubCategory(B)展平,然后再将其分组到Category(A):http://www.sqlfiddle.com/#!2/fccf1/19
SELECT
  A.Name, A.Description,
  COALESCE(SUM(B.ClicksSum),0) AS ClicksSum,
  COALESCE(SUM(B.ImpressionsSum),0) AS ImpressionsSum,
  COALESCE(SUM(B.ViewsSum),0) AS ViewsSum,
  COALESCE(SUM(B.VisitorsSum),0) AS VisitorsSum
FROM A
LEFT JOIN
(

  SELECT
    B.ID, B.TableA,
    SUM(C.ClicksSum) AS ClicksSum,
    SUM(C.ImpressionsSum) AS ImpressionsSum,
    SUM(C.ViewsSum) AS ViewsSum,
    SUM(C.VisitorsSum) AS VisitorsSum
  FROM B
  LEFT JOIN
  (

    SELECT
      C.TableB,

      D.ClicksSum,
      D.ImpressionsSum,

      E.ViewsSum,
      E.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

  ) C ON C.TableB = B.ID
  GROUP BY B.ID

) B ON B.TableA = A.ID
GROUP BY A.ID

输出:
|       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 |

关于MySQL按总和加入表组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12026182/

10-11 03:19
查看更多