编辑以澄清
我可能误解了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
答案 0 :(得分:8)
SELECT *... GROUP BY
不应该有用。你的第一个例子工作的事实是MySQL的一个棘手的功能。
要使GROUP BY有效,您的SELECT子句不能是*
。它必须是GROUP BY列和“聚合”函数的混合,如COUNT
,SUM
等。
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
应与count
,sum
,avg
等汇总函数一起使用。例如:
select product_name, sum(price)
from product_sales
group by product_name