如何按降序排序
我有以下表中调用的问题:如何按降序排序
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
因此,选择第一个 '鲍勃' 遇到代替最后一个。
感谢
如果你想为每个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不影响服务器选择的值。
的记录需要使用GROUP BY
和MAX()
让每一个asker
最大ID进行分组。
SELECT asker, MAX(ID) ID
FROM TableName
GROUP BY asker
输出
╔════════╦════╗
║ ASKER ║ ID ║
╠════════╬════╣
║ Bob ║ 2 ║
║ Marley ║ 3 ║
╚════════╩════╝
尽管如何获得每个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的答案的改进版本。
问:您的ID列设置为INTERGERS或VARCHAR? – 2013-03-13 16:01:13
自动增量整数 – 2013-03-13 16:02:07