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