微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何按DESC顺序分组

如何解决如何按DESC顺序分组

如果要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

解决方法

我有下表称为问题:

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

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

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。