对mysql结果进行排序。按列1排序,按列2分组

对mysql结果进行排序。按列1排序,按列2分组,mysql,sql-order-by,Mysql,Sql Order By,我有一个包含两列“id”和“name”的表。id是常规的自动增量索引,名称只是varchar id name 1 john 2 mary 3 pop 4 mary 5 john 6 michael 7 john 8 will 我想像这样对搜索结果排序 8 will 7 john 5 john 1 john 6 michael 4 mary 2 mary 3 pop Id是DESC,但所有重复的名称都分组在一起。如果ASC更容易实现,那也没关系。如有必要,我可

我有一个包含两列“id”和“name”的表。id是常规的自动增量索引,名称只是varchar

id  name
1  john
2  mary
3  pop
4  mary
5  john
6  michael
7  john
8  will
我想像这样对搜索结果排序

8  will
7  john
5  john
1  john
6  michael
4  mary
2  mary
3  pop
Id是DESC,但所有重复的名称都分组在一起。如果ASC更容易实现,那也没关系。如有必要,我可以在PHP中反转结果

按名称的常规顺序,id DESC首先对所有名称进行排序,然后对id进行排序。那不是我想要的。我对名字的字母顺序不感兴趣

我希望id按描述顺序排列,如果有重复的名称,则按重复的名称分组


p、 很抱歉,这是一个重复的问题。

如果我理解正确,您将需要一个临时表

SELECT TableName.id, TableName.Name FROM TableName
INNER JOIN 
(
    SELECT Name, max(id) as maxid FROM TableName GROUP BY Name
) as tmp on tmp.Name = TableName.Name
ORDER BY maxid DESC, id DESC

在mysql中有一个GROUPBY子句,请参阅,并在页面上搜索GROUPBY

页面上有一些例子

所以试试这个

SELECT id, name FROM TableName
group BY name;
由于您的ID充当主键,您可能不需要告诉它按升序排序,但您可以添加

order by id
如果你愿意

当然,GROUPBY子句还允许添加ASC和DESC子句,因此如果需要,应该按字母顺序获取它们

不过,也就是说,只需使用

order by desc(name)
可能会得到类似的结果,您需要在数据集上进行测试

请注意,这可能是一个非常昂贵的选择,因为它试图将所有内容整理成您所需的顺序。 因此,如果您希望将其用作其他选择的基础,则可以决定创建一个临时表,然后直接进行选择,否则每次使用主表时,分组可能会重新发生。 不过,一旦您的数据集变得相当大,这可能是您想要研究的事情。
结果id中的David不存在DESCIn SQL
ORDER BY
将通过逐个比较对结果行进行排序。由于所需结果中
5 john
的位置取决于
7 john
的位置,因此这将不起作用。我担心没有一个关系结构能够满足您的需求。@Alma Do Mundo:您是对的。身份证不是按DECS顺序排列的。但是有一个全局DECS顺序(8,7,6,4,3)和一组本地DECS顺序(7,5,1)(4,2),我在内部联接和ORDERBY之间放置WHERE子句。有效:)谢谢。