【问题标题】:How do I order a group by clause in sql [duplicate]如何在sql中订购group by子句[重复]
【发布时间】:2013-05-24 17:18:30
【问题描述】:

我想使用 group by 从我的 FileList 中选择所有不同的文件。但我只想返回具有最高 id 的元素。我只得到第一个条目。 如何解决这个问题?

select * from files group by name;

这是我的表格内容...

 ID      NAME          DATE               USER 
1443 - /test.txt - 24 May 2013 12:56:15 - XX
1444 - /test.txt - 24 May 2013 12:54:41 - XX
1445 - /test.txt - 24 May 2013 12:53:38 - AB
1446 - /test.txt - 24 May 2013 12:44:32 - XX
1983 - /asdf.txt - 24 May 2013 13:46:32 - KS

【问题讨论】:

标签: mysql group-by greatest-n-per-group


【解决方案1】:
select * from files 
where id in
(
  select max(id)
  from files
  group by name
)

select f.* 
from files f
inner join 
(
  select max(id) as id
  from files
  group by name
) x on x.id = f.id

SQLFiddle demo

【讨论】:

  • 我认为这种语法在 ANSI 标准平台上无效..
  • 真的吗?为什么?我看不出问题。
  • ANSI SQL 要求选择列表包括 GROUP BY 子句中的列。因此,您可以编写子查询:(select name, max(id) as id from files group by name),这样就可以了。
  • @BillKarwin 这仍然不应该在 MSSQL 中工作。看起来这是有效的。
  • 啊哈——我错了。您可以有一个没有分组列的选择列表。以下是基于“SQL-99 Complete,Really”的 GROUP BY 规则的参考:kb.askmonty.org/en/rules-for-grouping-columns 但是,除非它位于分组函数中,否则您不能拥有带有非分组列的选择列表。例如。 select a, b, max(c) from table group by a 使 b 模棱两可。
【解决方案2】:

使用这个:-

select *,max(id) from files group by name;

【讨论】:

  • 我猜它被否决了,因为 group by 的使用不正确(就像在原始问题中一样) - 即使它在标准配置中被 MySQL 接受,请参见此处:rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html跨度>
  • 不正确?如何 ??你的意思是我应该在选择列表中包含“名称”?
  • 是的,完全正确。阅读我评论中的链接。
猜你喜欢
  • 2013-04-25
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
相关资源
最近更新 更多