SQL查询有时会返回错误的结果

时间:2017-07-02 22:13:36

标签: sql

我有这个问题:

query = "SELECT DISTINCT set_number " +
        "FROM next_workout_exercises " +
        "WHERE next_id = " + workoutid + " AND exercise_number = " + exercise_number;

并返回一些结果。

在此之后,我有另一个查询如下:

query = "SELECT * FROM (SELECT * FROM next_workout_exercises INNER JOIN exercises WHERE next_workout_exercises.exercise_id = exercises.id )" +
" WHERE next_id = " + workoutid + " AND exercise_number = " + exercise_number + " AND set_number = " + set_number;

这会返回零结果有时候。 set_number与第一个查询相同,没有数据发生变化。

有人可以评论为什么会发生这种情况吗?

有问题的表格:

CREATE TABLE exercises
(
    id             INTEGER PRIMARY KEY,
    exercise_name  TEXT,
    explanation    TEXT,
    type           INTEGER,
    target_body    INTEGER,
    exercise_video TEXT,
    exercise_pic1  TEXT,
    exercise_pic2  TEXT,
    picturetype    INTEGER,
    backedup       INTEGER
);    

CREATE TABLE next_workout_exercises
(
    id              INTEGER PRIMARY KEY,
    next_id         INTEGER,
    exercise_id     INTEGER,
    weightkg        REAL,
    weightlb        REAL,
    reps            INTEGER,
    reps2           INTEGER,
    set_number      INTEGER,
    exercise_number INTEGER,
    incrementkg     REAL,
    incrementlb     REAL,
    resttime1       INTEGER,
    resttime2       INTEGER,
    resttime3       INTEGER,
    failures        INTEGER,
    failuresallowed INTEGER,
    percentage      REAL,
    reptype         INTEGER,
    exercisetype    INTEGER,
    backedup        INTEGER,
    FOREIGN KEY(next_id) REFERENCES nextWorkout(id),
    FOREIGN KEY(exercise_id) REFERENCES exercises(id)
);

2 个答案:

答案 0 :(得分:0)

如果(a)没有人修改数据,(b)你的第二个查询对workoutid和exercise_number使用相同的值,(c)你的第二个查询是使用从第一个查询返回的set_number,那么您错误指定的加入条件必然是您有时只获得所需数据的原因。

您可以指定如下的连接条件:

ON next_workout_exercises.exercise_id = exercises.id

除非您使用更传统的方式编写联接,否则您不会使用WHERE子句进行连接。

编写第二个查询的更简洁方法是:

SELECT n.*, e.*
FROM next_workout_exercises n
INNER JOIN exercises e ON n.exercise_id = e.id
WHERE n.next_id = :workoutid
AND n.exercise_number = :exercise_number
AND n.set_number = :set_number

哦,请使用占位符帮助您的DBA。这看起来像是使用它们的理想代码。

答案 1 :(得分:0)

您的数据集似乎不包含next_workout_exercises中包含next_idexercise_number的行,其中包含您在第二个中使用的set_number查询。

您的第一个查询只显示“从表中提供所有唯一的set_number值”,但不保证您在第二个查询中指定的set_number来自第一个查询的唯一集。