Android ROOM SQL 查询- 我如何 return 当前日期的所有记录练习?
Android ROOM SQL Query- How can I return all logged exercises on Current Date?
所以我想 运行 一个 SQL 查询,它从多个 table 中获取值。
我希望获得:
exercises_table 中的 exerciseName 和 exerciseID
来自 exercise_junction_table 的 junctionID
来自 exercise_workout_goals table 的 setNumber、minReps、maxReps
然后我还有一个 log_entries_table.
此 table 存储有关用户已记录的锻炼的信息。
从此 table 我希望获得特定日期的所有日志的计数(如果有的话)。
如果日期没有日志,我希望 return 值为 0。
ER图
此刻,我的查询成功 returns 所有结果,其中日志在传递日期存在或为空。
但是,如果日志已在之前的日期保存,则之前记录的练习不会 returned,因为练习有一个日志,其日期既不为空也不等于当前日期。
我可以说 WHERE log_entries_table.date != :date
但是 logs_today 会保留所有日志的计数,而不管日期如何,这不会 return 当前日期的所有日志条目的计数
如何将此查询修改为仅 return logs_today 的计数,其中 log_entries.date = 日期?
我当前查询
@Query("SELECT exercises_table.exercise_Name, exercises_table.exercises_id,
exercise_workout_goals_table.set_number, exercise_workout_goals_table.junction_id,
exercise_workout_goals_table.min_reps, exercise_workout_goals_table.max_reps, log_id,
COUNT(log_id) AS logs_today FROM exercises_table LEFT JOIN exercise_workout_junction_table
ON exercises_table.exercises_id = exercise_workout_junction_table.exercise_id
LEFT JOIN exercise_workout_goals_table ON
exercise_workout_junction_table.exercise_workout_id = exercise_workout_goals_table.junction_id
LEFT JOIN log_entries_table
ON exercise_workout_junction_table.exercise_workout_id = log_entries_table.junction_id
WHERE exercise_workout_junction_table.workout_id = :button_id
AND (log_entries_table.date = :date OR log_entries_table.date is NULL)
GROUP BY exercises_table.exercises_id
ORDER BY exercise_workout_junction_table.exercise_workout_id; ")
LiveData<List<ExerciseAndGoal>> getAllWorkoutExercises(int button_id, String date);
练习和目标实体
(这里包含了我想要获取的所有字段)
public class ExerciseAndGoal {
private String exercise_name;
private int set_number;
private int min_reps;
private int max_reps;
private int exercises_id;
private int junction_id;
private int log_id;
private int logs_today;
public String getExercise_name() {
return exercise_name;
}
public void setExercise_name(String exercise_name) {
this.exercise_name = exercise_name;
}
public int getSet_number() {
return set_number;
}
public void setSet_number(int set_number) {
this.set_number = set_number;
}
public int getMin_reps() {
return min_reps;
}
public void setMin_reps(int min_reps) {
this.min_reps = min_reps;
}
public int getMax_reps() {
return max_reps;
}
public void setMax_reps(int max_reps) {
this.max_reps = max_reps;
}
public int getExercises_id() {
return exercises_id;
}
public void setExercises_id(int exercises_id) {
this.exercises_id = exercises_id;
}
public int getJunction_id() {
return junction_id;
}
public void setJunction_id(int junction_id) {
this.junction_id = junction_id;
}
public int getLog_id() {
return log_id;
}
public void setLog_id(int log_id) {
this.log_id = log_id;
}
public int getLogs_today() {
return logs_today;
}
public void setLogs_today(int logs_today) {
this.logs_today = logs_today;
}
}
那么我认为你必须删除条件 WHERE:
(log_entries_table.date = :date OR log_entries_table.date is NULL)
并转让其中的一部分:
log_entries_table.date = :date
到你的表的条件连接:
ON exercise_workout_junction_table.exercise_workout_id = log_entries_table.junction_id AND log_entries_table.date = :date
所以我想 运行 一个 SQL 查询,它从多个 table 中获取值。 我希望获得:
exercises_table 中的 exerciseName 和 exerciseID 来自 exercise_junction_table 的 junctionID 来自 exercise_workout_goals table 的 setNumber、minReps、maxReps 然后我还有一个 log_entries_table.
此 table 存储有关用户已记录的锻炼的信息。 从此 table 我希望获得特定日期的所有日志的计数(如果有的话)。
如果日期没有日志,我希望 return 值为 0。
ER图
此刻,我的查询成功 returns 所有结果,其中日志在传递日期存在或为空。
但是,如果日志已在之前的日期保存,则之前记录的练习不会 returned,因为练习有一个日志,其日期既不为空也不等于当前日期。
我可以说 WHERE log_entries_table.date != :date
但是 logs_today 会保留所有日志的计数,而不管日期如何,这不会 return 当前日期的所有日志条目的计数
如何将此查询修改为仅 return logs_today 的计数,其中 log_entries.date = 日期?
我当前查询
@Query("SELECT exercises_table.exercise_Name, exercises_table.exercises_id,
exercise_workout_goals_table.set_number, exercise_workout_goals_table.junction_id,
exercise_workout_goals_table.min_reps, exercise_workout_goals_table.max_reps, log_id,
COUNT(log_id) AS logs_today FROM exercises_table LEFT JOIN exercise_workout_junction_table
ON exercises_table.exercises_id = exercise_workout_junction_table.exercise_id
LEFT JOIN exercise_workout_goals_table ON
exercise_workout_junction_table.exercise_workout_id = exercise_workout_goals_table.junction_id
LEFT JOIN log_entries_table
ON exercise_workout_junction_table.exercise_workout_id = log_entries_table.junction_id
WHERE exercise_workout_junction_table.workout_id = :button_id
AND (log_entries_table.date = :date OR log_entries_table.date is NULL)
GROUP BY exercises_table.exercises_id
ORDER BY exercise_workout_junction_table.exercise_workout_id; ")
LiveData<List<ExerciseAndGoal>> getAllWorkoutExercises(int button_id, String date);
练习和目标实体
(这里包含了我想要获取的所有字段)
public class ExerciseAndGoal {
private String exercise_name;
private int set_number;
private int min_reps;
private int max_reps;
private int exercises_id;
private int junction_id;
private int log_id;
private int logs_today;
public String getExercise_name() {
return exercise_name;
}
public void setExercise_name(String exercise_name) {
this.exercise_name = exercise_name;
}
public int getSet_number() {
return set_number;
}
public void setSet_number(int set_number) {
this.set_number = set_number;
}
public int getMin_reps() {
return min_reps;
}
public void setMin_reps(int min_reps) {
this.min_reps = min_reps;
}
public int getMax_reps() {
return max_reps;
}
public void setMax_reps(int max_reps) {
this.max_reps = max_reps;
}
public int getExercises_id() {
return exercises_id;
}
public void setExercises_id(int exercises_id) {
this.exercises_id = exercises_id;
}
public int getJunction_id() {
return junction_id;
}
public void setJunction_id(int junction_id) {
this.junction_id = junction_id;
}
public int getLog_id() {
return log_id;
}
public void setLog_id(int log_id) {
this.log_id = log_id;
}
public int getLogs_today() {
return logs_today;
}
public void setLogs_today(int logs_today) {
this.logs_today = logs_today;
}
}
那么我认为你必须删除条件 WHERE:
(log_entries_table.date = :date OR log_entries_table.date is NULL)
并转让其中的一部分:
log_entries_table.date = :date
到你的表的条件连接:
ON exercise_workout_junction_table.exercise_workout_id = log_entries_table.junction_id AND log_entries_table.date = :date