【问题标题】:Please explain the functionality of select max(...) ... group by in sql请解释 select max(...) ... group by in sql 的功能
【发布时间】:2012-05-22 02:56:40
【问题描述】:

我明白这在许多人看来可能是一个愚蠢的问题,但我无法在任何地方找到关于“分组依据”对 SQL 语句中的 select max(...) 的影响的明确解释。

我有以下数据(还有另一个未显示的 mediumblob 类型的列图像):

id  title                      test_id 

1  bomb                             0 
2  Soft watch                       2 
3  Dali                             1 
4  Narciss                          1 
5  The Woman In Green               0 
6  A summer in Vetheuil             0 
7  Artist's Garden                  2 
8  Beech Forest                     2 
9  Claude Monet                     0 

我知道我是否执行

select max(id) from images 
where image is not null; 

我得到了 id 的最大值,即:

max(id) 

9

但是有人可以解释一下我表演时发生了什么

select max(id), title, test_id 
from images 
where image is not null 
group by id; 

我发现 max(id) 没有任何用处(结果如下所示)?

  max(id)  title                      test_id 

  1  bomb                              0 
  2  Soft watch                        2 
  3  Dali                              1 
  4  Narciss                           1 
  5  The Woman In Green                0 
  6  A summer in Vetheuil              0 
  7  Artist's Garden                   2 
  8  Beech Forest                      2 
  9  Claude Monet                      0 

【问题讨论】:

  • 你想从表中获取最新的行吗?表中的最后一行(更准确地说)。
  • 由于 ID(通常)是唯一的,因此按 ID 分组将创建 1 个组。
  • 尝试用GROUP BY test_id替换它,看看会发生什么。
  • 为什么查询没有返回单行“9 Claude Monet 0”?
  • @Alastair:因为您按id 分组。因此,对于每个唯一的id,它将返回该组中最高的id。由于id 是唯一的,因此每个“组”包含 1 条记录。那么,每个组的最大值就是该记录。

标签: mysql sql


【解决方案1】:

在使用MAX() 的情况下,GROUP BY 子句实质上是告诉查询引擎如何对项进行分组以确定最大值。在您的第一个示例中,您只选择了一个列,因此不需要分组。但是在您的第二个示例中,您有多个列。因此,您需要告诉查询引擎如何确定要比较哪些以找到最大值。

您告诉它按id 列分组。这意味着它将比较具有相同id 的记录,并为每个唯一id 提供最大的记录。由于每条记录都有不同的id,因此您基本上没有对该子句做任何事情。

它将具有1id 的所有记录分组(这是一条记录),并返回该组中具有最大id 的记录(即该记录)。对23 等也是如此。

对于此处显示的三列,唯一可以对记录进行分组的地方是 test_id 列。像这样的:

SELECT MAX(id), title, test_id
FROM images
WHERE image IS NOT null 
GROUP BY test_id

这将按test_id 对它们进行分组,因此结果将包括记录 6(test_id 0 的最大 id)、4(test_id 1 的最大 id)和 8( id 的最大值为 test_id 2)。通过根据test_id 列中的三个唯一值将记录分成这三个组,它可以有效地找到每个组中的“最大值”id

【讨论】:

  • 感谢大家的帮助,我觉得@David的解释是最清晰简洁的。
【解决方案2】:

是的,在您的示例中它没有任何用处。

您按 ID 分组,然后找到最大 ID。但这没有意义,因为每个 ID 只有一个。通常 MAX() 用于数量,例如价格或商品数量等。

【讨论】:

    【解决方案3】:

    Group by 不用于此类查询 它用于这样的查询

    OId OrderDate   OrderPrice  Customer
    
    1   2008/11/12  1000    Hansen
    
    2   2008/10/23  1600    Nilsen
    
    3   2008/09/02  700 Hansen
    
    4   2008/09/03  300 Hansen
    
    5   2008/08/30  2000    Jensen
    
    6   2008/10/04  100 Nilsen
    

    现在,如果您想获得每个客户购买的材料总和,您将使用 group by

    SELECT Customer,SUM(OrderPrice) FROM Orders 按客户分组

    customer    SUM(OrderPrice)
    
    Hansen  2000
    
    Nilsen  1700
    
    Jensen  2000
    

    在上述情况下,id 是唯一的,因此按 id 分组没有任何意义

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 1970-01-01
      • 2013-04-17
      • 2012-12-08
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多