【问题标题】:Joining three table then group加入三个表然后分组
【发布时间】:2011-02-17 01:58:31
【问题描述】:

我将连接三个表,然后将其中一个列与另一个列的值相乘。

SELECT t1.column, t2.column, SUM(t1.column * t2.column)
FROM table1 t1 
     INNER JOIN table2 t2 
         ON t1.id = t2.id 
     JOIN table3 t3 
         ON t2.id = t3.id 
GROUP BY t1.column, t2.column;

这个查询符合我的要求,但我不明白为什么 GROUP BY 有效?

如果我将列添加到选择中,我是否还必须将列添加到分组依据?

【问题讨论】:

  • 这是 GroupBy 的约束。非聚合的所有列都必须是 Group By Clause 的一部分...但是我不清楚您的问题...您到底在问什么?
  • “所有非聚合的列都必须是 Group By Clause 的一部分...” @S M Kamran:至少对于 MySQL 来说不是这样。

标签: sql database join group-by


【解决方案1】:

你真的知道你在这里做什么吗?

SELECT t1.column, t2.column, SUM(t1.column * t2.column)
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id
JOIN table3 t3 ON t2.id = t3.id
GROUP BY t1.column, t2.column;

该查询至少在两个方面非常可疑:

  • 不使用 Table3 - 除了验证 t3 中是否存在 t2 中 id 的记录。你想要那个吗? Potential pitfall 如果每个 t2 记录有多个 T3 记录,您将得到一个 cartesian product,这是 SUM 列的意外相乘。

  • GROUP BY t1.column, t2.column - 这结合了(t1.column, t2.column) 的所有独特组合,并将t1.column * t2.column 的结果相加。这真的是你所追求的吗?

对于第 2 点,请考虑以下(源)数据:

t1.id, t1.column, t2.column, t1.column*t2.column
1      2          3          6
2      2          3          6
3      3          3          9
4      3          4          12

你最终得到了输出

t1.column, t2.column, SUM(t1.column*t2.column)
2          3          12
3          3          9
3          4          12

看到 (2,3) 合并了总和。

如果我将列添加到选择中,我还必须将列添加到分组依据。

SELECT 中的列(除了一些 DBMS,如 MySQL)必须是聚合(例如 sum/avg/min/max)或 GROUP BY 子句中的列。 您可以使用其他表达式,例如标量函数或不直接来自表的常量值。

如果您确实需要从表相关到聚合的更多列,则需要清楚地考虑为什么。例如如果您按 column1 分组并对 column2 进行平均,那么您想对 column3 做什么 - 它应该来自哪一行?

【讨论】:

    【解决方案2】:

    那是因为 SUM 是一个聚合函数,它是根据每个组的结果计算的。

    【讨论】:

      【解决方案3】:

      首先不要担心JOINs。要理解GROUP BY,首先看一个很简单的查询。

      SELECT t1.year, t1.person
      FROM table t1
      

      这会返回

      年份 |人 2000 |乔 2000 |贝蒂 2000 |马蒂 2001 |乔 2002 |贝蒂

      如果你抛出一个聚合函数,你必须为聚合函数未涵盖的所有内容添加GROUP BY

      SELECT t1.year, COUNT(t1.person) as counter
      FROM table t1
      GROUP BY t1.year
      
      年份 |柜台 2000 | 3 2001 | 1 2002 | 1

      如果您不包含 GROUP BY,则它不起作用,因为数据库实际上不知道您希望如何对数据进行分组。

      【讨论】:

        【解决方案4】:

        当 GROUP BY 有多个参数时,例如在您的情况下,它表示“首先按定义 #1 排序,如果有多个定义 #1,则按定义 #2 排序,如果有多个定义 #2然后将它们组合在一起。”。

        【讨论】:

          【解决方案5】:

          作为聚合函数的目标的列不必是GROUP BY 子句的一部分。聚合函数就是SUM, AVG, MIN, MAX等函数。

          【讨论】:

            【解决方案6】:

            因为聚合函数给你一个返回值...

            首先它会排序,然后使用不同的排序结果集对该集合执行聚合操作。

            【讨论】:

              猜你喜欢
              • 2012-04-11
              • 2021-08-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多