我需要将每个集合的sets.weight
更新为等于workout.body_weight + sets.weight
。
我有一个表格sets
,代表一组升降机,该升降机属于一个升降机组,又属于一个锻炼(锻炼有升降机组,每个升降机组都有升降机,每个升降机都有组)。 workout.body_weight
是我举起那天的体重。
sets.weight
是我为该特定组举起的重量。
对于加权引体向上,我只是将身体悬垂的重量存储在sets.weight
中。我想将此字段更新为当天workouts.body_weight
的当前值 plus 。
我尝试了类似的类似问题中发现的许多建议,但是在尝试复制时会遇到语法错误。可能是因为Sqlite具有更有限的功能集,而这些答案仅适用于MySQL或PostgreSQL等。
我设法选择相关数据:
SELECT
*
FROM
sets as T1
inner join (
SELECT
workouts.body_weight + sets.weight as new_weight,
sets.id as id
FROM
sets
LEFT JOIN lifts ON sets.lift_id = lifts.id
LEFT JOIN lift_groups ON lifts.lift_group_id = lift_groups.id
LEFT JOIN workouts ON workouts.id = lift_groups.workout_id
WHERE
lifts.lift_id = 5
) T2 ON T1.id = T2.id
这将输出id
,lift_id
,reps
,reps_goal
,weight
,new_weight
,id
字段(前5个是sets
所有LEFT JOIN
都可以将集合连接到相应的父锻炼,这样我就可以检索锻炼。body_weight
如何更改此设置以基本上完成UPDATE sets SET weight = new_weight
的使用?
答案 0 :(得分:0)
这最终成功了:
UPDATE
sets
SET
weight = (
SELECT
sets.weight + workouts.body_weight as new_weight
FROM
sets T2
INNER JOIN lifts on sets.lift_id = lifts.id
INNER JOIN lift_groups ON lifts.lift_group_id = lift_groups.id
INNER JOIN workouts on workouts.id = lift_groups.workout_id
WHERE
lifts.lift_id = 5
AND sets.id = T2.id
)
where
EXISTS (
SELECT
sets.weight + workouts.body_weight as new_weight
FROM
sets T2
INNER JOIN lifts on sets.lift_id = lifts.id
INNER JOIN lift_groups ON lifts.lift_group_id = lift_groups.id
INNER JOIN workouts on workouts.id = lift_groups.workout_id
WHERE
lifts.lift_id = 5
AND sets.id = T2.id
)
让我大吃一惊的是,在sqlite中,我无法以UPDATE tablename AS alias . . .
开始查询。相反,我必须省略别名,但是对于带括号的SELECT语句,我可以使用一个,然后将两个表称为tablename和tablealias。您可以在摘要中看到我所做的。
第一个和第二个带括号的SELECTS是等效的。第一个生成我要更新为的新值。这被输入到UPDATE部分。 WHERE EXISTS只是一种安全措施,可以确保在SELECT不返回任何行的情况下,权重不会设置为null。