2013-08-25 3 views
2

Я пытаюсь преобразовать этот простой SQL запрос в то Django может работать:Оптимизировать аннотированный запрос в Django

SELECT * 
FROM location AS a 
WHERE a.travel_distance = (
    SELECT MAX(travel_distance) 
    FROM location AS b 
    WHERE b.person_id = a.person_id 
) 
ORDER BY a.travel_distance DESC 

То, что это в основном делает, все выборки пройденных мест и выбрать только те строки, которые содержат максимальное перемещение расстояние.

Это то, что я получил до сих пор:

travels = Location.objects.filter(pk__in=Location.objects.order_by().values('person_id').annotate(max_id=Max('id')).values('max_id')).order_by('travel_distance')[::-1] 

Хотя результаты соответствуют друг другу. Второй метод возвращает результаты намного дольше.

Есть ли способ переписать этот запрос, чтобы он стал быстрее?

+0

Кроме того, вы можете дважды проверить свой запрос, поскольку я не думаю, что он возвращает строки с максимальным расстоянием перемещения. Ваши аннотации с Max ('id'), а также возвращаемое местоположение pk действительно соответствуют идентификаторам человека. – Fiver

ответ

0

Разве это не работает? Что-то наподобие:

select max(id), sum(travel_distance) from table group by person_id; 
+0

Спасибо за ответ, но я ищу способ оптимизировать Django-запрос, а не запрос SQL. – jefvlamings

1

Если я правильно понял, вы хотите, чтобы максимальное расстояние, пройденное для каждого человека. Предполагая, что существует модель Person, возможно, спросите у другого направления. Что-то вроде:

Person.objects.values('id').annotate(max_distance=Max('location__travel_distance')) 

Я не проверял это, так как я не эквивалентная схема данных удобно, но делает эту работу за вас?

+0

Как получить другую информацию из таблицы местоположений в этом запросе (например, имя, широта, долгота, ...)? – jefvlamings

+0

Хмм, я не думаю, что вы можете получить эту информацию, используя этот подход. Очень интересный вопрос. Я думаю, проблема заключается в том, что Django не позволяет добавлять аннотации + разные. Я считаю, вы можете застрять с SQL – Fiver

Смежные вопросы