2013-09-30 122 views
2

我有一个包含2列'id'和'name'的表格。 id是常规自动增量索引,名称只是varchar。排序mysql结果。按col1排序,按col2排序

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 

标识的搜索结果进行排序是降序,但所有重复的名称组合在一起。没关系如果ASC更容易实现。如有必要,我可以在PHP中取消结果。

Regular ORDER BY name,id DESC首先对所有名称进行排序,然后对id进行排序。这不是我想要的。我对字母顺序的名字不感兴趣。

我希望以DESC顺序编号,如果有重复名称,请将其分组。

p.s.我很抱歉这是一个重复的问题。

+0

在你的结果中id是** not ** DESC –

+1

在SQL'ORDER BY'中,通过逐一比较结果行来排序结果行。由于'5 john'在你想要的结果中的位置取决于'7 john'的位置,所以这将不起作用。我担心没有一个能够满足您的需求的关系构造。 –

+0

@Alma Do Mundo:你说得对。 Id的字面不是按照DECS的顺序。但有一个全局的DECS命令(8,7,6,4,3)和一组本地DECS命令(7,5,1)(4,2) – CoR

回答

3

如果我正确理解你,你需要一个临时表。

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 
+0

我在INNER JOIN和ORDER BY之间放置了WHERE子句。它工作:)谢谢。 – CoR

0

在mysql中有一个group by子句,请参阅select,并在页面上搜索group by。

有页面

所以试试这例子...

SELECT id, name FROM TableName 
group BY name; 

随着你的ID作为主键,你可能并不需要告诉它升序排序,但如果您愿意,您可以添加

order by id 

当然,group by子句还可以添加ASC和DESC子句,所以如果您愿意,应该按字母顺序排列它们。

虽然,这说只是使用

order by desc(name) 

将可能给你一个类似的结果,你需要测试它在你的数据集。

请注意,这可能是一个非常昂贵的选择,因为它会尝试将所有内容排序到所需的顺序。 因此,如果您希望将其用作其他选择的基础,则可以决定创建临时表,然后可以直接选择,否则每次使用主表时可能会重新发生分组。 尽管您的数据集变得相当大,但这可能是您想要考虑的事情。 David