2015-09-26 580 views
2

我正在優化我寫的一個小應用程序,以減少每個請求的數據庫調用次數,並且不知道如何構建我的SQL查詢。將多個相同的SQLite查詢合併爲一個

我有數據這樣的事情

name stat1 stat2 stat3 
john 1  2  22 
john 2  4  -2 
richard 3  4  0 
john 0  3  1 
jacob 12  9  -20 

我現在的說法是沿着線的東西:

userNames = execute("SELECT DISTINCT name FROM ___") 
for user in userNames: 
    var userdata = "SELECT avg(stat1), avg(stat2), avg(stat3) FROM ___ WHERE name == '"+str(user) 

現在這個理解並不好。它會打20個電話(幸好我的用戶表現在很低),但它的規模很差。 (每個數據庫調用需要.050s)

一個朋友建議沿着線的東西:

"SELECT avg(stat1),avg(stat2),avg(stat3) from ___ where name in " userNames 

但這僅返回一行,在那裏我需要LEN(用戶名)行#。

這是使用Join的好例子嗎? (我是一個SQL noob)。

謝謝!

回答

3

這不是關於Python或連接。

您需要的是聚合。您想計算每個不同名稱的平均值,並通過GROUP BY在SQL中執行此操作。所以:

SELECT name, avg(stat1), avg(stat2), avg(stat3) FROM ____ GROUP BY name; 

輸出(SQLite中):

jacob|12.0|9.0|-20.0 
john|1.0|3.0|7.0 
richard|3.0|4.0|0.0 
+0

謝謝你的建議!增加了一個額外的約束,現在它運作得非常好。 'SELECT name,avg(stat1)... FROM ___ WHERE name in(....)GROUP BY name' –