我有理由相信此代码可以做得更好,并且可能从查询开始做更多的工作?
我将尽力解释这一点。
我数据库中的每一行都有一个1,2或3值exercise
,然后还有一个数字,因为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项目。
您可以使用Group By
和MAX
聚合函数仅通过一个查询选择感兴趣的所有行。
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
)。
总体性能是最佳的。
您只需要遍历此查询的结果。
请参阅本主题。
编辑:
排除多个(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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句