代码之家  ›  专栏  ›  技术社区  ›  Matteo Riva

指定要从group by子句返回的记录

  •  5
  • Matteo Riva  · 技术社区  · 14 年前

    编辑澄清

    我可能误解了 GROUP BY 因此,我只需重新表述我的问题,而不必假设如何解决问题:

    我有一张清单 term_id 和包含对象的表(其中 object_id PK和 白蚁 作为其他字段中的fk),我需要提取具有最高值的对象 对象ID 对于每一个 白蚁 提供。正确的方法是什么?

    原始问题

    我肯定我遗漏了一些明显的东西,但我不知道如何指定 哪一个 记录将由带有 小组通过 . 默认情况下 小组通过 返回组中的第一条记录,谁可以不使用子查询而获取最后一条记录?

    基本查询返回第一条记录:

    SELECT *
        FROM wp_term_relationships
        WHERE term_taxonomy_id IN (20, 21, 22)
        GROUP BY term_taxonomy_id
    

    这是可行的,但是使用子查询

    SELECT * 
        FROM (
            SELECT * 
            FROM wp_term_relationships
            WHERE term_taxonomy_id IN (20, 21, 22)
            ORDER BY object_id DESC
        ) wtt
        GROUP BY term_taxonomy_id
    

    这是语法错误

    SELECT * 
        FROM wp_term_relationships
        WHERE term_taxonomy_id IN (20, 21, 22)
        ORDER BY object_id DESC
        GROUP BY term_taxonomy_id
    
    4 回复  |  直到 14 年前
        1
  •  8
  •   S.Lott    14 年前

    SELECT *... GROUP BY 不应该工作。你的第一个例子是可行的,这是MySQL的一个奇怪的特性。

    若要按工作分组,则select子句不能 * .它必须是按列分组和类似于 COUNT , SUM 等。

    SELECT COUNT(*), some_column FROM... GROUP BY some_column 是预期的形式。

    SELECT * 不需要工作。

    您希望找到每个术语的最高对象ID。

    SELECT MAX(term_id), object_id FROM some_table GROUP BY object_id
    

    像那样?

        2
  •  3
  •   Oded    14 年前

    您发布的示例中没有正确的T-SQL。你不能 SELECT * 当使用 GROUP BY 条款。

    小组通过 不返回组中的第一条记录-它按子句中指定的列聚合(您也可以在 SELECT 条款)。

    您需要在 选择 条款。您没有指定要获取的聚合类型,因此我将在示例中使用count作为记录数:

    SELECT COUNT(term_taxonomy_id)
    FROM wp_term_relationships
    WHERE term_taxonomy_id IN (20, 21, 22)
    GROUP BY term_taxonomy_id
    
        3
  •  1
  •   KM.    14 年前

    我不想重复其他答案所说的,但想添加一些关于SQL分组的信息,这可能有助于…

    请考虑按以下顺序生成的查询结果:

    和; 加入 确定和筛选行
    在哪里? 这些行上有更多的筛选器
    小组通过 将这些行组合成组(现在每个组一行)
    在组级别筛选组
    按顺序 排列其余的行/组

        4
  •  0
  •   Klaus Byskov Pedersen    14 年前

    GROUP BY 应与聚合函数一起使用,例如 count , sum , avg 等:

     select product_name, sum(price) 
     from product_sales
     group by product_name