Сначала примечание: в вашем примере first ORDER BY
не обязательно.Они никогда не находятся в подвыборах, и фактически для меньшей СУБД это привело бы к ненужной операции упорядочения (хотя я думаю, что большинство игнорирует это ORDER BY
). ( Edit : Строго говоря, это не 't true. Однако в большинстве случаев упорядочение таблиц не имеет значения и имеет значение только порядок ваших результатов. Ваш запрос на самом деле является интересным исключением)
Но то, что вы делаете, может быть выполненос Django ORM и не требует необработанного SQL.Ваш SQL в общем-то странный.По сути, вы можете переписать его следующим образом:
SELECT
*
FROM
scores
GROUP BY
user
ORDER BY
score DESC
Подвыбор на самом деле ничего не делает (упорядочение не имеет значения для исходных данных, только в выводе), поэтому он просто исчезает.
Так что в этом случае для части Django ORM вы можете просто использовать функции агрегирования , чтобы выполнить то, что вам нужно.
edit - так как вы указалив комментариях, что первый ORDER BY
действительно оказывает влияние из-за побочного продукта использования SELECT *
[1] без каких-либо агрегаций при GROUP
ing, соответствующий SQL будет:
SELECT
user
,MAX(score) AS high_score
FROM
scores
GROUP BY
user
ORDER BY
MAX(score) DESC
И снова вы можете использовать функции агрегирования, упомянутые по ссылке выше, чтобы получить эквивалентные операторы ORM.Это выглядело бы примерно так:
User.objects.annotate(high_score=Max('scores__score')).order_by('high_score')
Предполагается, что у вас есть внешний ключ от Score
до User
(Django выяснит, как соединить эти два, чтобы получить соответствующее поле score
от вашей Score
модели).
[1] - Это также подчеркивает, почему не рекомендуется использовать SELECT *
в реальном коде!