当前位置: 首页 > 知识库问答 >
问题:

如何按DESC顺序分组

韩乐湛
2023-03-14

我有以下称为问题的表:

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

我想选择每个asker只一次,如果有多个asker具有相同的名称,选择最高的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

它选择遇到的第一个‘鲍勃',而不是最后一个。

共有1个答案

施轶
2023-03-14

如果您想要每个asker的最后一个ID,那么应该使用聚合函数:

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

之所以会得到不寻常的结果,是因为MySQL使用了GROUP BY的扩展名,该扩展名允许选择列表中的项不被聚合,并且不包括在GROUP BY子句中。但是,这会导致意想不到的结果,因为MySQL可以选择返回的值。(请参见要分组的MySQL扩展)

在MySQL文档中:

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

现在,如果您需要从表返回其他列,但由于可能得到的结果不一致而不希望通过将它们添加到组,那么您可以使用子查询来执行此操作。(演示)

html" target="_blank">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分组。 另外,循环/游标也是不可能的,因为我正在处理大量数据,谢谢。 问题答案:

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