Android SQLITE — не возвращает правильные данные?

#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);
  

Спасибо за вашу помощь и ответы!