当前位置: 首页 > 面试题库 >

如何按DESC顺序分组

倪阳飇
2023-03-14
问题内容

我有下表称为问题:

ID | asker 
1  | Bob
2  | Bob
3  | Marley

我只想选择每个询问者一次,如果有多个同名提问者,请选择ID最高的一个。因此,预期结果:

ID | asker 
3  | Marley
2  | Bob

我使用以下查询:

SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC

我得到以下结果:

ID | asker 
3  | Marley
1  | Bob

因此,它将选择遇到的第一个“鲍勃”,而不是最后一个。

谢谢


问题答案:

如果要id为每一个添加最后一个asker,则应使用聚合函数:

SELECT max(id) as id, 
   asker
FROM questions 
GROUP by asker 
ORDER by id DESC

之所以得到不寻常的结果,是因为MySQL使用了一个扩展名,GROUP BY该扩展名允许未选择列表中的项进行汇总,并且不包含在GROUP
BY子句中。但是,这可能导致意外结果,因为MySQL可以选择返回的值。(请参阅MySQL对GROUP
BY的扩展

从MySQL文档中:

MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP
BY子句中命名的非聚合列。…您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。但是,这主要在每个未聚合列中未在GROUP
BY中命名的所有值对于每个组都相同时才有用。服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。此外,通过添加ORDER
BY子句不会影响从每个组中选择值。选择值之后,将对结果集进行排序,并且ORDER BY不会影响服务器选择的值。

现在,如果您还有其他需要从表中返回的列,但是GROUP BY由于可能会导致不一致的结果而不想将它们添加到中,则可以使用子查询来这样做。(演示)

select 
  q.Id,
  q.asker,
  q.other -- add other columns here
from questions q
inner join
(
  -- get your values from the group by
  SELECT max(id) as id, 
    asker
  FROM questions 
  GROUP by asker 
) m
  on q.id = m.id
order by q.id desc


 类似资料:
  • 我有以下称为问题的表: 我想选择每个asker只一次,如果有多个asker具有相同的名称,选择最高的ID之一。所以,预期的结果: 我使用以下查询: 我得到以下结果: 它选择遇到的第一个‘鲍勃',而不是最后一个。

  • 我尝试将以下PostgreSQL查询表述为Jooq: 因此,我想用一个使用窗口函数的嵌套查询编写一个查询,并首先从内部查询开始。我走了那么远: 在orderBy命令之后,我在Jooq中不再使用DESC选项。只有像或这样的命令,还有像这样的继承命令,它返回一个SortField-object,我不能再调用所需的后续命令。

  • 问题内容: 我只是想按ID对评论进行排序,但是这样做并不幸运。无法弄清楚该怎么办,因为这使我感到困惑: 你们碰巧知道我如何通过DESC中的ID来订购评论吗?谢谢! 问题答案: 首先,您要进行两次相同的操作。这是不必要的,因为您可以计算行数并从单个查询中获取数据。除此之外,用注释表的唯一ID替换您,即可设置好。替换为以颠倒排序顺序。

  • 问题内容: 我了解我可以按如下顺序在sql查询中按顺序使用变量: 但是我也该如何在asc和desc部分中使用变量? 问题答案: 没有每个选项,它的子句例如:

  • 问题内容: 我有一些这样的数据: 我想查询它看起来像这样: …这样我就可以按数字连续的方式按GROUP BY分组。 另外,循环/游标也是不可能的,因为我正在处理大量数据,谢谢。 问题答案:

  • 问题内容: 在发现了惊人的发现之后,我再次陷入了困境。 问题是我有一个形式的字典,我需要按其整数值的降序对其进行排序, 但是 如果两个元素的值相同,则按键的升序排列。 一个使它更清楚的例子: 经过研究后,我得出以下结论: 这是因为它对值和键都进行了反向排序。我需要不撤消的钥匙。 问题答案: 就像是