我有这个问题:
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)
);
答案 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_id
和exercise_number
的行,其中包含您在第二个中使用的set_number
查询。
您的第一个查询只显示“从表中提供所有唯一的set_number值”,但不保证您在第二个查询中指定的set_number
来自第一个查询的唯一集。