我在做一个健身跟踪网站。用户可以添加减肥目标,并使用卡路里计算器来计算他们从某些运动中减少了多少卡路里。我已经实现了一个进度条,它可以显示用户的卡路里减少进度。它还显示了两个值,一个是用户已经丢失的总卡路里数,另一个是用户目标减少的卡路里目标值。
当我添加多个目标时,目标卡路里值是正确的,但是,显示用户减少了多少卡路里的值似乎乘以该用户输入了多少目标。
我正在努力研究如何防止这种情况发生,以及无论设定了多少目标,显示用户减少了多少卡路里的值。
例如,用户总共燃烧了1310卡路里。当用户添加第二个减肥目标时,在用户不输入任何减肥活动的情况下,该卡路里减少量将加倍至2620。
这是我用过的查询...
$sql = "SELECT
SUM(calories) as calories
, CASE g.weightunit
WHEN 'lbs' THEN 3500
ELSE 7700
END * weightlost as target_calories
FROM (SELECT * FROM goal ORDER BY weightlost DESC) g
INNER JOIN tracklog t USING (userid)
WHERE userid = ? ";
$stmt = $con->prepare($sql);
$stmt->bind_param('i', $_SESSION['userid']);
$stmt->execute();
$stmt->bind_result($calories, $target);
$res = $stmt->fetch();发布于 2017-04-02 04:55:52
考虑将单元级别goal连接到aggregate level,tracklog,然后通过userid连接。现在,您在单元级别连接两者,然后聚合,沿着连接对多个匹配进行多次求和。
SELECT t.SumCalories,
CASE WHEN g.weightunit = 'lbs' THEN 3500 ELSE 7700 END *
g.weightlost As Target_calories
FROM goal g
INNER JOIN
(SELECT sub.userid, SUM(sub.calories) as SumCalories
FROM tracklog sub
GROUP BY sub.userid) t
USING (userid)
WHERE g.userid = ?
ORDER BY g.weightlost DESC顺便说一句,您可能正在使用MySQL,并将ONLY_FULL_GROUP_ON设置为off,因为引擎不会通过在GROUP BY子句中没有指定的非聚集列的语法错误。
所有其他的RDBMS都会为此抛出一个错误。作为最佳实践,请始终使用GROUP BY在聚合查询中指定分组,以避免不可靠的结果。
https://stackoverflow.com/questions/43159957
复制相似问题