Android Комната SQL Запрос - Как мне запустить запрос с условным предложением WHERE - PullRequest
0 голосов
/ 09 мая 2020

Итак, я хотел бы запустить запрос SQL, который получает значения из нескольких таблиц. Я хочу sh, чтобы получить:

  • имя упражнения и идентификатор упражнения из таблицы упражнений
  • идентификатор соединения из таблицы упражнений_соединения
  • setNumber, minReps, maxReps из таблицы упражнений_workout_goals

У меня также есть log_entries_table.

В этой таблице хранится информация об упражнении, которое пользователь зарегистрировал. Из этой таблицы я sh, чтобы получить COUNT всех журналов для указанной c даты, если таковые имеются.

Если журналов нет на дату, я хотел бы, чтобы возвращаемое значение было 0.

Диаграмма ER

Из моих исследований кажется, что мне понадобится какое-то условное предложение WHERE, но только если log_entry существует в дату, которая передается ему.

Если журнала нет, я просто хотел бы, чтобы раздел WHERE date = :date игнорировался.

В настоящий момент мой запрос возвращает только результаты, в которых logEntry присутствует из-за моего WHERE date = :date (дата берется из таблицы log_Entries, поэтому, если журнал отсутствует, не будет вообще никакой даты).

Я не могу разобраться, как сделать WHERE date = :date условно и запускать его только в упражнениях, в которых присутствует хотя бы один logEntry.

Любая помощь будет принята с благодарностью.

Мой текущий запрос (Это только возвращает значения, в которых logEntry на th Присутствует дата его прохождения.)

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

1 Ответ

1 голос
/ 09 мая 2020

Вы используете просто «JOIN» в последнем предложении, оно равно «INNER JOIN».

Это «INNER JOIN» выбрасывает ваши строки из результата, где это условие ложно:

exercise_workout_junction_table.exercise_workout_id = log_entries_table.junction_id

Замените последнее «JOIN» на «LEFT JOIN» и с изменениями, которые я написал в комментарии:

AND (log_entries_table.date = :date OR log_entries_table.date is NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...