#java #android #sql #sqlite
#java #Android #sql #sqlite
Вопрос:
У меня возникла проблема с SQL-запросом в Android — похоже, он не возвращает правильный результат, что, я думаю, может быть связано с моей структурой запроса, возможно.
Это запущенное приложение. У меня есть начальный запрос, который работает правильно, который дает мне наиболее распространенный из последних трех запусков, который является:
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);
Итак, теперь у меня самая распространенная дистанция активность (бег / езда на велосипеде и т. Д.) из последних трех запусков, поэтому я хотел запустить запрос, который выдал мне комбинацию activity distance в последних трех с ускоренным временем, поэтому у меня есть это:
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);
Итак, единственное, что здесь особенного, это подзапрос, который дает мне самое быстрое время, что, как я полагаю, может быть ошибкой, однако я не могу понять, почему. В конце этого у курсора есть три результата, хотя он должен быть одним (Есть два одинаковых действия расстояния и одно уникальное — с разными временными секундами, поэтому он должен возвращать то, которое является самым быстрым.
Буду признателен за любую помощь!
Комментарии:
1. Покажите некоторые примеры данных и желаемые результаты.
2. Знаете ли вы какой-нибудь хороший способ отображения данных SQLLite в Android без необходимости запускать цикл по курсору для получения каждого результата? Я все равно попытаюсь это сделать!
Ответ №1:
Если я правильно понимаю, вам нужна строка с самым быстрым временем выполнения. Вместо того, чтобы использовать подзапрос для поиска этого значения, почему бы просто не упорядочить по этому времени выполнения и не выбрать первый результат :
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);
Комментарии:
1. Потому что мне нужно упорядочить по идентификатору, чтобы получить последние три запуска — поскольку я получаю самый быстрый и распространенный запуск за последние три. Я думаю, на самом деле я мог бы создать временную таблицу с наиболее распространенными запусками, а затем запросить ее в порядке выполнения, чтобы получить самую быструю — жаль, что не было способа сделать это без использования временной таблицы, хотя! Спасибо за ваш ответ!
2. Хорошо, я думал, что
order by
были бесполезны, в подзапросе, потому что там он имеет только один результат (это агрегат безgroup by
) и в основном запросе, потому что он тоже имеет только один результат (если только не существует нескольких строк с одинаковым значением минимального времени выполнения). Я не понимаю, почему ваш запрос возвращает 3 строки. Очевидно, я что-то пропустил, извините
Ответ №2:
Спасибо за помощь! В конце концов, мне удалось разобраться с этим! Предложение Bwt с упорядочением по времени выполнения — вот что меня туда привело!
Я просто использовал подзапрос для выбора из последних трех запусков, тогда я мог бы упорядочить по времени выполнения и ограничить его только одним результатом, получая самый быстрый запуск!
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);
Спасибо за вашу помощь и ответы!