简体   繁体   中英

Android SQLITE - Not Returning Correct Data?

I'm having an issue with a SQL query in Android - it doesn't seem to be returning the correct result, which I think might be due to my query structure possibly.

This is a running app. I have an initial query that works correctly, that gets me the most common out of the last three runs, which is:

Cursor workout = db.rawQuery("SELECT ActivityID, DistanceID FROM Workout WHERE _id IN(Select _id FROM Workout ORDER BY _id DESC LIMIT 3) Group By ActivityID, DistanceID HAVING COUNT(*) > 1", null);

So now I have the most common distance + activity (running/biking ect..) out of the last three runs, so I wanted to run a query that got me the activity + distance combination on the last three with the fasted time, so I have this:

                Cursor fastestWorkout = db.rawQuery
                            ("Select _id, RunTimeSeconds, Distance FROM Workout WHERE ActivityID = " + workout.getInt(0) +
                            " AND DistanceID = " + workout.getInt(1) +
                            " AND RunTimeSeconds IN " +
                            "(Select Min(RunTimeSeconds) From Workout WHERE ActivityID = " + workout.getInt(0) +
                            " AND DistanceID = " + workout.getInt(1) +
                            " ORDER BY _id DESC LIMIT 3)" +
                            " ORDER BY _id DESC LIMIT 3", null);

So the only thing special here is the sub-query that gets me the fastest time, which I imagine might be at fault, however I can't work out why. The cursor has three results in it at the end of this, when it should be one (There are two activities+distances that are the same and one unique - with different RunTimeSeconds, so it should be pulling back that one that is the fastest.

Any help would be appreciated!

If I understand correctly you want the row with the fastest run time. Instead of using a subquery to find this value, why not just order by this run time and pick the first result :

         Cursor fastestWorkout = db.rawQuery
                        ("Select _id, RunTimeSeconds, Distance FROM Workout WHERE ActivityID = " + workout.getInt(0) +
                        " AND DistanceID = " + workout.getInt(1) +
                        " ORDER BY RunTimeSeconds LIMIT 1", null);

Thanks for the help! I managed to figure this one out in the end! Bwt's suggestion with the ordering by run-time is what got me there!

I just used a sub-query to select from the last three runs, then I could order by the run-time and limit it to just one result, getting the fastest run!

        Cursor fastestWorkout = db.rawQuery
                       ("Select _id, RunTimeSeconds, DistanceID FROM (Select _id, RunTimeSeconds, DistanceID, ActivityID FROM Workout ORDER BY _id DESC LIMIT 3) WHERE ActivityID = " + workout.getInt(0) +
                        " AND DistanceID = " + workout.getInt(1) +
                        " ORDER BY RunTimeSeconds LIMIT 1", null);

Thanks for your help ans answers!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM