如何将GROUP BY与JOIN结合使用?

时间:2019-05-25 07:17:46

标签: mysql sql

我试图从一个表中的一列中获取值,并将它们与另一个表中多个列中的最大值相结合,其中第一个表的值作为外键多次出现。我还需要将SELECT返回的次数限制为1。

我的(简化的)表如下所示:

Names:
+--+------+
|PK|  name|
+--+------+
| 1|  Fred|
| 2|   Bob|
| 3|George|
+--+------+
Values:
+--+----+----+----+--+
|PK|val1|val2|val3|FK|
+--+----+----+----+--+
| 1|   1|   2|   5| 2|
| 2|   2|   0|   2| 1|
| 3|   1|   1|NULL| 1|
| 4|   7|   0|NULL| 2|
| 5|   0|   3|   3| 3|
| 6|   5|   2|   2| 3|
| 7|   6|   3|   0| 1|
| 8|   1|   2|   5| 3|
| 9|   0|   2|NULL| 2|
+--+----+----+----+--+

我当前的请求是:

SELECT Name.name, GREATEST(Vals.val1, COALESCE(val2, 0), COALESCE(val3, 0))
    FROM Name INNER JOIN (Vals) ON Name.PK = Vals.FK;

目的是获取每个名称曾经出现的最大值。结果应类似于以下内容: 麦克斯:

+------+---+
|  name|max|
+------+---+
|  Fred|  6|
|   Bob|  7|
|George|  5|
+------+---+

但是目前我看到的是:

+------+---+
|  name|max|
+------+---+
|  Fred|  2|
|  Fred|  1|
|  Fred|  6|
|   Bob|  5|
|   Bob|  7|
|   Bob|  2|
|George|  3|
|George|  5|
|George|  5|
+------+---+

获得每次出现的名称键的平均值。我不确定是否需要'WHERE'或'GROUP BY'来解决此问题,但是每次尝试使用它时,都会遇到错误。例如:

SELECT Name.name, GREATEST(Vals.val1, COALESCE(val2, 0), COALESCE(val3, 0))
    FROM Name INNER JOIN (Vals) ON Name.PK = Vals.FK GROUP BY Name.name;

SELECT Name.name, GREATEST(Vals.val1, COALESCE(val2, 0), COALESCE(val3, 0)) WHERE Vals.FK = Name.PK
    FROM Name INNER JOIN (Vals) ON Name.PK = Vals.FK;

1 个答案:

答案 0 :(得分:0)

通过聚合函数将每行将多行减少为单个值是MAX

SELECT Name.name,
       MAX(GREATEST(Vals.val1, COALESCE(val2, 0), COALESCE(val3, 0))) max
  FROM Name
  INNER JOIN (Vals) ON Name.PK = Vals.FK
  GROUP BY Name.name;