2012-05-25 57 views
1

我有以下的(簡化)結構的表格:MySQL的:按組和現場

INT id, 
INT type, 
INT sort 

我需要的是,在某種程度上排序我的數據的選擇,因此:

  • 所有同一類型的行都按順序排列,內部按sort遞增排序,而
  • 一種類型的所有「塊」按其最小值sort排序。

例子:

如果表是這樣的:

| id | type | sort | 
| 1 | 1 | 3 | 
| 2 | 3 | 5 | 
| 3 | 3 | 1 | 
| 4 | 2 | 4 | 
| 5 | 1 | 2 | 
| 6 | 2 | 6 | 

查詢應排序的結果是這樣的:

| id | type | sort | 
| 3 | 3 | 1 | 
| 2 | 3 | 5 | 
| 5 | 1 | 2 | 
| 1 | 1 | 3 | 
| 4 | 2 | 4 | 
| 6 | 2 | 6 | 

我希望這是明確足夠。

在我看來,這應該是一個非常普遍的要求,但是我沒有找到任何足夠接近的例子來將其轉移到我自己的用例中。我想我至少不能避免一個子查詢,但我沒有自己想出來。

任何幫助表示讚賞,在此先感謝。順便說一下:我將在CakePHP 2.1中使用這個查詢,所以如果你知道用Cake做一個舒服的方法,請告訴我。

+0

可能的重複http://stackoverflow.com/questions/1309841/how-to-order-by-a-sum-in-mysql – nidhin

+0

因爲我仍然擺弄着把它傳遞給CakePHP,我打開了它問題,只有在這裏特定的蛋糕:http://stackoverflow.com/questions/10798183/cakephp-sort-by-group-maximum-minimum – bfncs

回答

4

這比最初聽起來更簡單。我相信下面的應該做的伎倆:

SELECT a.id, a.type, a.sort 
FROM Some_Table as a 
JOIN (SELECT type, MIN(sort) as min 
     FROM Some_Table 
     GROUP BY type) as b 
ON b.type = a.type 
ORDER BY b.min, a.type, a.sort 

爲了達到最佳(最快)的結果,你可能會想在(typesort)的索引。
如果有兩個組具有相同的sort值(會導致混合行),您還希望按a.type(而不是(b.min,a.sort))進行額外排序。如果沒有重複值,可以將其刪除。

+0

我測試了這個,但它不適合我,但我認爲你很接近。編輯:其實它似乎現在工作。 – Keith

+1

非常感謝X-Zero!編輯完成後,這似乎工作正常! – bfncs

+0

子查詢解釋在這個頁面的底部http://book.cakephp.org/1.3/view/1030/Complex-Find-Conditions – dogmatic69

0

排序和類型是某些數據庫的保留字,可能會導致您遇到問題。

你試過了嗎?

ORDER BY TYPE DESC, SORT ASC 
+1

不幸的是,這不會得到OP想要的,並且不匹配他期望的輸出。 –