【问题标题】:Android ROOM SQL Query- How can I return all logged exercises on Current Date?Android ROOM SQL 查询 - 如何返回当前日期的所有记录练习?
【发布时间】:2020-05-11 11:11:24
【问题描述】:

所以我想运行一个从多个表中获取值的 SQL 查询。 我希望得到:

练习表中的练习名称和练习 ID 来自 exercise_junction_table 的 junctionID 来自 exercise_workout_goals 表的 setNumber、minReps、maxReps 然后我还有一个 log_entries_table。

此表存储有关用户已记录的锻炼的信息。 如果有的话,我希望从这个表中获取特定日期的所有日志的 COUNT。

如果该日期没有日志,我希望返回值为 0。

ER图

目前,我的查询成功返回了日志在其传递日期存在或为空的所有结果。

但是,如果日志已保存在之前的日期,则不会返回之前记录的锻炼,因为锻炼的日志既不为空也不等于当前日期。

我可以说WHERE log_entries_table.date != :date 但是logs_today 将保存所有日志的计数,无论日期如何,这不会返回当前日期的所有日志条目的计数

如何修改此查询以仅返回 log_entries.date = date 的 logs_today 计数?

我当前的查询

@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;
    }
}

【问题讨论】:

    标签: android sql sqlite android-sqlite android-room


    【解决方案1】:

    那么我认为你必须删除条件 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      相关资源
      最近更新 更多