2017-02-10 6 views
0

Ich habe Gründe zu glauben, dass dieser Code viel besser gemacht werden kann, und wahrscheinlich viel mehr von der Arbeit mit der Abfrage zu beginnen?SQL: Improve Select Query

Ich werde versuchen, dies zu erklären.

Jede Zeile in meiner Datenbank hat entweder einen 1, 2 oder 3 Wert für exercise, und dann auch eine Nummer wie rep, die irgendeine Zahl sein könnte, aber in diesem Code wähle ich nur für 1-12, also dies Code wählt die Zeile, die den höchsten Wert von kilograms (was eine Spalte und hat einen Wert für jede Zeile), wo exercise ist 1 und rep ist 1, und dann 2 und 3 usw. usw. bis 12, dann ändert sich exercise zu 2 und geht von 1-12 wieder die obere kilograms Zeile auswählen.

Macht das Sinn?

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> 
     } 
    } 
} 

Ich benutze SQL Server Compact, und es ist kein MVC-Projekt.

+0

Bitte sagen Sie nicht dieser Teil der cshtml Datei ist? – trailmax

+0

Warum nicht? @trailmax –

+0

Razor-Dateien werden erstellt, um Ansichtsmodelldaten in HTML-Markup zu übernehmen. DB-Anfragen sollten im Controller leben und ein View-Modell mit den Daten übergeben. (Angenommen, MVC) – trailmax

Antwort

3

Sie können alle Zeilen, die Sie interessieren, mit nur einer Abfrage unter Verwendung der aggregierten Funktion Group By und MAX auswählen.

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' 

Innere Abfrage wird nur einmal ausgeführt. Es findet eine Gruppenkennung (exercise, rep) Tupel und ein entsprechender maximaler Gruppenwert kg. Dann innere Abfrage wird mit Test Tabelle verbunden, um "Inhalt" von Zeilen zu erhalten (in Ihrem Fall nur ein zusätzliches Feld date).

Die Gesamtleistung ist optimal.

Sie müssen nur über Ergebnisse dieser Abfrage iterieren.

Siehe this topic.


Edit:

ausschließt mehrere (rep, exercise) Datensätze mit gleichem kg (fast gleichem Ergebnis wie OPs Looping)

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

Ich teste diese gerade aus, ich sehe, dass ich mehr über Joins erfahren muss, weil ich den Code nicht verstehe, haha, diese zwei verschiedenen Abfragen führen zu verschiedenen Dingen, die spätere zeigt ungefähr die Hälfte der Zeilen, aber ich bin mir nicht sicher, welche die richtige ist, ich möchte auch "Übung" ausschleifen, damit ich sehen kann Was ist, was zu bestimmen, ob es richtig ist oder nicht, wenn Sie damit helfen möchten! –

+0

Okey, also habe ich es geschafft, die Übungsnummer anzuzeigen und sie mit den Ergebnissen meines alten Abfrage-/for-Loop-Codes zu vergleichen, und wenn 'Übung' 2 oder 3 ist, hat es alle korrekten Ergebnisse erhalten, aber wenn es 1 war, wurde es nur angezeigt 4 von 6 Ergebnissen, die meine Abfrage zeigte, können nicht herausfinden, warum:/ –

+0

Was * 'meine Abfrage' * redest du? Wie ich sehen kann, können Sie 'getPR' Abfrage höchstens 1 Ergebnis zurückgeben. Sie sagen, Ihre Abfrage zurückgegeben 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 

Wiederholen Sie diese Ergebnisse und zeigen Sie sie an.

+0

resultierte in diesem 'Es gab einen Fehler bei der Analyse der Abfrage. [Token-Zeilennummer = 1, Token-Zeilen-Offset = 66, Token in Fehler = SELECT] ' –