2013-06-04 196 views
3

我有一個MySQL表,它包含有關程序功能使用情況的統計信息。我從中檢索基本上就像這樣(前15名總點擊這裏):使用行排序的SQL子查詢的顛倒順序

SELECT function_id, data_timer, SUM(data_counter) total 
FROM data 
GROUP BY function_id 
ORDER BY total DESC 

+-------------+------------+-------+ 
| function_id | data_timer | total | 
+-------------+------------+-------+ 
|   56 |  567 | 4389 | 
|   23 |  7880 | 1267 | 
|   7 |  145 | 812 | 
|   ... |  ... | ... | 
+-------------+------------+-------+ 

由於這些結果網站模塊中,用戶可以選擇哪些列將用於ORDER BY以及ASC之間和DESC,我需要檢索排名的每行結果。

有了這個question的幫助下,我才得以將排序分配的結果的每一行:

SET @rank = 0; 
SELECT @rank:[email protected]+1 AS rank, function_id, data_timer, SUM(data_counter) total 
FROM data 
WHERE client_id = 2 
GROUP BY function_id 
ORDER BY total DESC 

+------+-------------+------------+-------+ 
| rank | function_id | data_timer | total | 
+------+-------------+------------+-------+ 
| 1 |   56 |  567 | 4389 | 
| 2 |   23 |  7880 | 1267 | 
| 3 |   7 |  145 | 812 | 
| ... |   ... |  ... | ... | 
+------+-------------+------------+-------+ 

我現在有一些困難,試圖顛倒這個表,這意味着我想有結果首先用最少使用的函數排序。像這樣的東西(假設有76起):

+------+-------------+------------+-------+ 
| rank | function_id | data_timer | total | 
+------+-------------+------------+-------+ 
| 76 |   44 |  346 |  1 | 
| 75 |   2 |  3980 |  4 | 
| 74 |   13 |  612 |  7 | 
| ... |   ... |  ... | ... | 
+------+-------------+------------+-------+ 

這裏是我的SQL查詢的嘗試:

SELECT rank, function_id, data_timer, total 
FROM 
(
SET @rank = 0; 
SELECT @rank:[email protected]+1 AS rank, function_id, data_timer, SUM(data_counter) total 
FROM data 
WHERE client_id = 2 
GROUP BY function_id 
ORDER BY total DESC 
) 
ORDER BY rank DESC 

它不斷出現我:

#1064 - You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near 
'SET @rank = 0' at line 4 

因爲我不是對SQL太熟練了,我猜我錯過了一些明顯的東西。

任何幫助將不勝感激,謝謝!

+0

如果你按總遞減排序,將反轉由總ASC訂購,不是?爲什麼使用子查詢? –

+0

「*我希望先用最少使用的函數對結果進行排序。」什麼表示這個值? 'SUM(data_counter)',別的? –

回答

2

您正試圖在您的子查詢中分配一個變量。這不起作用。將分配移動到子查詢之外,它應該運行。

SET @rank = 0; 
SELECT rank, function_id, data_timer, total 
FROM 
(
SELECT @rank:[email protected]+1 AS rank, function_id, data_timer, SUM(data_counter) total 
FROM data 
WHERE client_id = 2 
GROUP BY function_id 
ORDER BY total DESC 
) 
ORDER BY rank DESC 
+0

我知道我錯過了一些明顯的東西,哈哈。感謝您的快速回復! –

1

另一種選擇是在查詢初始化你@rank變量,而不是一個單獨的語句:

SELECT rank, function_id, data_timer, total 
FROM 
(
    SELECT @rank:[email protected]+1 AS rank, function_id, data_timer, SUM(data_counter) total 
    FROM data, 
     (SELECT @rank := 0) r 
    WHERE client_id = 2 
    GROUP BY function_id 
    ORDER BY total DESC 
) r 
ORDER BY rank DESC 
+0

這不起作用,整個等級列填充NULL值。 –

+1

@AlexisLeclerc - 我編輯了答案(我遺漏了一個冒號) - 無論如何,很高興你能夠正常工作...... – sgeddes

+0

現在它也可以工作,感謝您的幫助! –