2017-04-01 61 views
0

我在做一个健身追踪网站。用户可以添加减肥目标,并使用卡路里计算器来计算他们在某些练习中失去了多少卡路里。我已经实现了一个显示用户卡路里损失进度的进度条。它还显示两个值,一个是用户失去的卡路里总数,另一个是用户目标丢失的目标卡路里数值。如何防止由于用户输入而导致值相乘?

当我添加多个目标时,目标卡路里数量值是正确的,但显示用户丢失多少卡路里的值似乎乘以该用户输入了多少个目标。

我在如何防止这种情况发生,以及显示用户失去多少卡路里的价值上挣扎,无论设置了多少目标。

例如,用户总共消耗了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(); 
+0

编辑你的问题,并提供样本数据和所需的结果。 –

+0

这对于您正在使用的查询类型是正常的。为什么你在桌子上有一个重量单位,你用它做什么?如果它改变了不同的目标呢? –

+0

@SamiKuhmonen当用户目标显示在他们的账户仪表盘上时,需要权重单位,以便他们可以跟踪他们设置的内容。他们只能选择磅或千克。 – monica44

回答

0

考虑参加单位级别,目标,以总体水平,追踪记录,然后通过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指定聚合查询中的分组以避免不可靠的结果。