SQL:提高选择查询

问题描述:

我有理由相信,这个代码可以做到更好,而且可能做得更与查询开始与工作的?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

您可以选择您感兴趣的只有一个使用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. –

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,令牌出错=选择]' –