指定从GROUP BY子句返回的记录

时间:2010-02-03 11:31:23

标签: sql mysql

编辑以澄清

我可能误解了GROUP BY的使用,所以我只是重新解释我的问题而不假设如何解决问题:

我有一个term_id列表和一个包含对象的表(在其他字段中有object_id PK和term_id作为FK),我需要提取对象提供的每个object_id的最高term_id。这样做的正确方法是什么?

原始问题

我确定我遗漏了一些显而易见的东西,但我无法弄清楚如何指定哪个记录将由GROUP BY的查询返回。默认情况下,GROUP BY返回组中的第一条记录,我可以在不使用子查询的情况下获取最后一条记录吗?

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

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 个答案:

答案 0 :(得分:8)

SELECT *... GROUP BY不应该有用。你的第一个例子工作的事实是MySQL的一个棘手的功能。

要使GROUP BY有效,您的SELECT子句不能是*。它必须是GROUP BY列和“聚合”函数的混合,如COUNTSUM等。

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

SELECT *预计不起作用。

您希望为每个term_id找到最高的object_id。

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

那样的东西?

答案 1 :(得分:3)

您发布的示例中没有一个是正确的T-SQL。使用SELECT *子句时,您无法GROUP BY

GROUP BY不返回组中的第一条记录 - 它按子句中指定的列聚合(您可以在SELECT子句中使用列。)

您需要在SELECT子句中使用聚合函数(例如SUM或COUNT或MAX)。你没有指定你想要获得什么样的聚合,所以我将在我的例子中使用COUNT作为记录数:

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

答案 2 :(得分:1)

我不想重复其他答案所说的内容,但想在SQL分组上添加一些信息,这可能有所帮助......

考虑按此顺序构建的查询结果:

  

FROM & 加入确定&过滤行
   WHERE 在这些行上有更多过滤器    GROUP BY 将这些行组合成组(现在每组一行)
   HAVING 过滤群组级别的群组    ORDER BY 排列剩余的行/组

答案 3 :(得分:0)

GROUP BY应与countsumavg等汇总函数一起使用。例如:

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