如何按降序排序

问题描述:

我有以下表中调用的问题:如何按降序排序

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 

因此,选择第一个 '鲍勃' 遇到代替最后一个。

感谢

+0

问:您的ID列设置为INTERGERS或VARCHAR? – 2013-03-13 16:01:13

+0

自动增量整数 – 2013-03-13 16:02:07

如果你想为每个asker最后id,那么你应该使用聚合函数:

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

你得到异常结果的原因是因为MySQL使用GROUP BY的扩展名,它允许选择列表中的项目不被聚合并且不包含在GROUP BY子句中。但是,这可能会导致意外的结果,因为MySQL可以选择返回的值。 (见MySQL Extensions to GROUP BY

从MySQL的文档:

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

+0

没有和我一起工作 – itsazzad 2016-04-19 10:38:21

+0

@itsazzad你是什么意思“不为我工作”?这不是对问题最具描述性的解释。 – Taryn 2016-04-19 11:39:27

+2

如果我使用'SELECT *,max(id)作为id',那么它没有给出正确的结果 – itsazzad 2016-04-19 11:44:48

的记录需要使用GROUP BYMAX()让每一个asker最大ID进行分组。

SELECT asker, MAX(ID) ID 
FROM TableName 
GROUP BY asker 

输出

╔════════╦════╗ 
║ ASKER ║ ID ║ 
╠════════╬════╣ 
║ Bob ║ 2 ║ 
║ Marley ║ 3 ║ 
╚════════╩════╝ 
+0

尽管如何获得每个ID的最大ID? – fungusanthrax 2017-07-17 14:24:15

其他人正确使用MAX(ID)来获得你想要的结果。如果您想知道为什么您的查询不起作用,那是因为ORDER BY发生在之后GROUP BY

通常MySQL只允许按升序排列记录。所以我们可以在分组之前订购记录。

 
SELECT * 
FROM (
    SELECT * 
    FROM questions 
    ORDER BY id DESC 
) AS questions 
GROUP BY questions.asker 

让每一个列:

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

@bluefeet的答案的改进版本。