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项目。
您可以选择您感兴趣的只有一个使用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
我现在正在测试这些,我发现我需要了解更多关于连接,因为我不明白代码哈哈,但是,这两个不同的查询会导致不同的结果,后面的结果会显示行数的一半,但我不确定哪一个是正确的,但我想循环使用'exercise',所以我可以看到什么是确定它的正确与否,如果你想帮助那个! –
Okey,所以我设法显示练习编号并将其与我的旧查询/循环代码的结果进行比较,当“exercise”为2或3时,它获得了所有正确的结果,但是当它为1时,它只显示我的查询显示的6个结果中有4个找不到原因:/ –
您在说什么*'我的查询'*?正如我所看到的,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
循环播放这些结果并显示它们。
导致这个'解析查询时出错。 [令牌行号= 1,令牌行偏移量= 66,令牌出错=选择]' –
请不要说这是CSHTML文件的一部分? – trailmax
为什么不呢? @trailmax –
Razor文件是为将视图模型数据应用于HTML标记而设计的。数据库请求应存在于控制器中,并将数据传递给视图模型。 (假设MVC) – trailmax