2017-02-10 100 views
0

我有理由相信,這個代碼可以做到更好,而且可能做得更與查詢開始與工作的?SQL:提高選擇查詢

我會試着解釋這一點。

我的數據庫中的每一行都有exercise的值爲1,2或3,然後是rep也可以是任意數字,但在此代碼中我選擇只關注1-12,所以這個代碼選擇具有的kilograms最高值(這是一個柱和具有值在每一行上),其中exercise爲1且rep是1行,然後2和3等等,直至如圖12所示,然後改變到exercise 2並從1-12再次選擇頂部kilograms行。

這是否有意義?

for (var i = 1; i <= 3; i++) { 
    for (var ii = 1; ii <= 12; ii++) { 
     var getPR = "SELECT top 1 kg, rep, date FROM Test WHERE exerVariName = 'Comp' AND exercise = @0 AND rep = @1 order by kg desc"; 
     db.Execute(getPR, i, ii); 
     foreach (var get in db.Query(getPR, i, ii)) { 
      DateTime Date = get.Date; 
      var finalDate = Date.ToString("MMM d, yyyy"); 
      var weight = get.kg + "kg"; 
      var reps = "x " + get.rep; 
      <a>@weight @reps - @finalDate</a> 
      <br> 
     } 
    } 
} 

我使用SQL Server Compact,它不是一個MVC項目。

+0

請不要說這是CSHTML文件的一部分? – trailmax

+0

爲什麼不呢? @trailmax –

+0

Razor文件是爲將視圖模型數據應用於HTML標記而設計的。數據庫請求應存在於控制器中,並將數據傳遞給視圖模型。 (假設MVC) – trailmax

回答

3

您可以選擇您感興趣的只有一個使用Group ByMAX聚合函數查詢的所有行。

SELECT t.kg, t.rep, t.date 
FROM Test t 
INNER JOIN 
    (SELECT MAX(kg) as kg, exercise, rep 
    FROM Test 
    WHERE exerVariName = 'Comp' 
    GROUP BY exercise, rep) i 
ON t.exercise = i.exercise AND t.rep = i.rep AND t.kg = i.kg 
WHERE t.exerVariName = 'Comp' 

內部查詢只執行一次。它找到一個組標識符(exercise, rep)元組和相應的最大kg組值。 然後內部查詢與Test表連接以獲取行的「內容」(在您的情況下只有一個附加字段date)。

整體表現退出最佳。

你只需要遍歷這個查詢的結果。

this topic


編輯:

排除多個(rep, exercise)記錄有相同kg(幾乎相同的結果,OP的循環)

SELECT kg, rep, exercise, MAX(date) 
FROM 
    (SELECT t.kg, t.rep, t.exercise, t.date 
    FROM Test t 
    INNER JOIN 
     (SELECT MAX(kg) as kg, exercise, rep 
     FROM Test 
     WHERE exerVariName = 'Comp' 
     GROUP BY exercise, rep) i 
    ON t.exercise = i.exercise AND t.rep = i.rep AND t.kg = i.kg 
    WHERE t.exerVariName = 'Comp') t 
GROUP BY t.kg, t.rep, t.exercise 
+0

我現在正在測試這些,我發現我需要了解更多關於連接,因爲我不明白代碼哈哈,但是,這兩個不同的查詢會導致不同的結果,後面的結果會顯示行數的一半,但我不確定哪一個是正確的,但我想循環使用'exercise',所以我可以看到什麼是確定它的正確與否,如果你想幫助那個! –

+0

Okey,所以我設法顯示練習編號並將其與我的舊查詢/循環代碼的結果進行比較,當「exercise」爲2或3時,它獲得了所有正確的結果,但是當它爲1時,它只顯示我的查詢顯示的6個結果中有4個找不到原因:/ –

+0

您在說什麼*'我的查詢'*?正如我所看到的,getPR'查詢最多可以返回1個結果。你說你的查詢返回6. –

0
SELECT kg, rep, date, exercise, rep FROM Test test1 WHERE rep = (SELECT TOP 1 test2.rep FROM Test test2 WHERE test2.exercise = test1.exercise AND test2.rep = test1.rep ORDER BY kg DESC) GROUP BY exercise, rep 

循環播放這些結果並顯示它們。

+0

導致這個'解析查詢時出錯。 [令牌行號= 1,令牌行偏移量= 66,令牌出錯=選擇]' –