2015-12-04 57 views
1

我是SQL(ite)的新手,所以我很抱歉,如果有一個簡單的答案,我只是愚蠢地找到正確的搜索條件。SQLite:從分組和排序的結果中選擇

我得到2個表格:1爲用戶信息和另一個用戶實現的持有點。這對於許多關係來說很簡單(用戶可以多次獲得積分)。

表1中包含「用戶ID」和「用戶名」 ...

表2中包含「用戶ID」和「金額」 ......

現在我想獲得高分排名對於一個給定的用戶名。 要獲得高分我所做的:

SELECT Username, SUM(Amount) AS total FROM table2 JOIN table1 USING (userID) GROUP BY Username ORDER BY total DESC 

我怎麼能選擇一個用戶名,並從分組和排序結果得到它的位置?我不知道子選詞如何看起來像我的目標。在單個查詢中甚至可能嗎?

+0

@CL,因爲你標記爲[this]的重複(http://stackoverflow.com/questions/5682886/retrieve-rank-from-sqlite-table),你能解釋一下如何使用'count(*)'來查詢分組和訂購?否則理查德是正確的,我必須在應用程序中或創建一個臨時表。 – ldr

+0

子查詢通過WHERE中的比較隱式排序。對於分組,請使用相關的子查詢。 –

+0

可悲的是我不知道/理解如何做到這一點。這就是爲什麼我首先問這個問題。你能發佈一個基於我給出的數據的工作代碼嗎,所以我可以理解你試圖暗示我的方向嗎?我已經覺得自己沒有得到它,所以我真的很感激它。 – ldr

回答

0

對於一個特定的用戶,這個查詢獲取總量:

SELECT SUM(Amount) 
FROM Table2 
WHERE userID = ? 

你要統計有多少其他用戶有更高的金額比單個用戶:

SELECT COUNT(*) 
FROM table1 
WHERE (SELECT SUM(Amount) 
     FROM Table2 
     WHERE userID = table1.userID) 
     >= 
     (SELECT SUM(Amount) 
     FROM Table2 
     WHERE userID = ?); 
+0

謝謝,因爲我擔心我的思維過程完全是在錯誤的方向。作爲答案的一個旁註:在大桌子上這很慢,所以它只適用於小桌子。 – ldr

+0

然後在'Table2.userID'上添加一個索引。 –

1

如果不引用其他數據,則無法計算用戶的位置。 SQLite沒有排名功能,這對你的用戶情況來說是理想的,也沒有行號功能可以作爲可接受的替代品。

我想最接近你可能會把這些數據放到一個臨時表中,但是我認爲你會在這裏變得非常混亂。

最好在應用程序中處理這個問題。獲取所有用戶並計算排名。根據需要緩存單個用戶結果。

不知道更多關於應用程序/數據庫的操作上下文的信息,很難提供更具體的建議。