所以,我想运行一个SQL查询,从多个表中获取值。
然后我还有一个log_entries_table。
这个表存储了关于用户已经记录的练习的信息.从这个表中我希望得到特定日期的所有日志的COUNT,如果有的话。
如果在该日期没有日志存在,我希望返回值为0。
从我的研究来看,似乎我需要某种条件WHERE子句,但只有在传递给它的日期上有日志存在时才需要。
如果没有日志存在,我只想用 WHERE date = :date
部分被忽略。
目前,我的查询只返回有日志条目的结果,因为我的 WHERE date = :date
(日期是从log_Entries表中获得的,因此如果没有日志,就不会有任何日期)。
我无法解决如何使 WHERE date = :date
条件,并且只在至少有一个logEntry的练习中运行。
任何帮助都将是非常感激的。
我目前的查询 (这只返回在它被传递的日期有一个日志条目的值。)
@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 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 ORDER BY
exercise_workout_goals_table.junction_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;
}
}
你只在最后一个子句中使用 "JOIN",它等于 "INNER JOIN"。
这个 "INNER JOIN "会把你的行从条件为假的结果中扔掉。
exercise_workout_junction_table.exercise_workout_id = log_entries_table.junction_id
用 "LEFT JOIN "替换你最后的 "JOIN",并修改我在评论中写的内容。
AND (log_entries_table.date = :date OR log_entries_table.date is NULL)