2013-09-30 200 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