2014-03-30 19 views
0

我正在使用查詢來查找給定測試ID中用戶的排名,這使得我一次只能進行一次測試的排名,而我必須使用foreach來獲得所有測試的測試等級。優化MySQL查詢以查找用戶在單個查詢中進行不同測試的排名

SELECT * , t.UserRank 
FROM (

SELECT * , (
@rownum := @rownum +1 
)UserRank 
FROM User_Date_Table, (

SELECT @rownum :=0 
)t 
WHERE my_test_id = '$test_id' 
ORDER BY test_score DESC 
)t 
WHERE user_id = '$my_user_id' 

可以查詢生成,可以給我用戶級別的所有用戶在單個查詢所採取的測試,因爲這樣會降低分貝擊中多次。

我必須找到Test_Type_Id = $ my_test_type_id用戶的所有行列(說),與b.my_test_id加入a.id爲用戶提供USER_ID = $ my_user_id(說)

TABLE STRUCTURE 

    My_Test_Table (a) 

    id | name | Test_Type_Id 
    ---------------------------------------------- 
    1 | name_1 | 1 
    2 | name_2 | 1  
    3 | name_3 | 2  
    4 | name_4 | 1  
    5 | name_5 | 1 
    6 | name_6 | 2  
    7 | name_7 | 1  
    8 | name_8 | 2  
    9 | name_9 | 1 



User_Date_Table (b) 

id | my_test_id | user_id | test_score 
--------------------------------------------------------- 
1 | 1 | 32 | 34 
2 | 1 | 2  | 345 
3 | 2 | 4  | 654 
4 | 1 | 76 | 87 
5 | 3 | 23 | 453 
6 | 2 | 5  | 45 
7 | 1 | 43 | 22 
8 | 2 | 7  | 987 
9 | 2 | 32 | 45 
10 | 1  | 1  | 12 
11 | 1  | 9 | 35 
12 | 3  | 67 | 765 
13 | 1  | 88 | 23 
14 | 2  | 34 | 76 
15 | 3  | 1  | 765 
16 | 2  | 54 | 45 
17 | 1  | 10 | 87 
18 | 1  | 23 | 3 
19 | 3  | 44 | 345 
20 | 1 | 55 | 232 
21 | 2  | 28 | 234 
22 | 3  | 32 | 231 
+0

您可以添加一些簡單的樣本數據和期望的結果嗎?我不清楚你想要查詢的輸出是什麼樣子。 –

+0

說我們需要在測試類型1中找到user_id = 32的排名 – atjoshi

回答

1

最簡單的方法可能就是刪除用戶變量進行排名,只是使用子查詢來完成;

SELECT *, (SELECT COUNT(*)+1 
      FROM User_Date_Table b 
      WHERE a.my_test_id = b.my_test_id 
      AND a.test_score < b.test_score) userrank 
FROM User_Date_Table a 
WHERE user_id = '1'; 

An SQLfiddle to test with

+0

如何將它與另一個表連接..通過選擇測試類型..來設置my_test_id – atjoshi

+0

您可以向您的問題中添加示例結果以獲取您給出的示例數據嗎?你從來沒有在你的問題中提到過,我不明白你在找什麼。 –

+0

它的工作都很好..只需要加入兩個表..其中my_test_id將採取形式的測試類型..只爲測試類型1我們需要找到.. 我必須找到所有的行列用戶與Test_Type_Id = $ my_test_type_id(說),加入a.id與b.my_test_id用戶user_id = $ my_user_id(說) – atjoshi

0
SELECT * , t.UserRank 
FROM ( 
    SELECT * , @rownum :=if(@user!=user_id,0, @rownum +1),@user:=user_id UserRank 
    FROM User_Date_Table , (SELECT @rownum :=0,@user :=-1) t 
    ORDER BY my_test_id ,test_score DESC 
    )t 
WHERE user_id = '$my_user_id' 

我們引入了額外的變量@user來重置user_id上的@rownum變化

+0

這裏用戶標識是相同的,所以我們需要重置test_id? – atjoshi