Android房间SQL查询-如何使用条件WHERE子句运行查询?

问题描述 投票:0回答:1

所以,我想运行一个SQL查询,从多个表中获取值。

  • ExerciseName和exerciseID来自exercise_table
  • 从exercise_junction_table的junctionID。
  • 从exercise_workout_goals表中设置Number、minReps、maxReps。

然后我还有一个log_entries_table。

这个表存储了关于用户已经记录的练习的信息.从这个表中我希望得到特定日期的所有日志的COUNT,如果有的话。

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

ER图

从我的研究来看,似乎我需要某种条件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;
    }
}
android sql sqlite android-sqlite android-room
1个回答
1
投票

你只在最后一个子句中使用 "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)
© www.soinside.com 2019 - 2024. All rights reserved.