commit c8d8ce569ee25a48e11aba9bcef5dd29f352733f
Author: Michal Mládek <osvc.04923031@gmail.com>
Date:   Wed May 21 07:38:55 2025 +0200

    Related to #26434 - main logic

diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 92a09c5840..1505454d3a 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -2303,6 +2303,35 @@ class Query(BaseExpression):
         else:
             self.default_ordering = False
 
+    @cached_property
+    def group_by_expressions(self):
+        """It converts group by items to expressions to be used
+        in ordering_needs_grouping
+        """
+        return {
+            group_e.name if hasattr(group_e, "name") else group_e
+            for group_e in self.group_by
+        }
+
+    def ordering_needs_grouping(self, order_by):
+        """It tells if order by could be removed or not
+        #26434 - QuerySet.count() has too aggresive strategy to remove it
+        """
+        if not self.group_by or isinstance(self.group_by, bool):
+            # it does not need grouping
+            return False
+        # order by can be Expression or String
+        order_e = order_by.expression if hasattr(order_by, "expression") else order_by
+        if hasattr(order_e, "contains_aggregate") and order_e.contains_aggregate:
+            # expression is aggregation -> does not need GROUP BY
+            return False
+        expr_name = order_e.name if hasattr(order_e, "name") else order_e
+        if expr_name in self.group_by_expressions:
+            # order by is not subset of grouping
+            return False
+        # otherwise order by expression needs to be in GROUP BY clause
+        return True
+
     def clear_ordering(self, force=False, clear_default=True):
         """
         Remove any ordering settings if the current query allows it without
@@ -2314,7 +2343,13 @@ class Query(BaseExpression):
             self.is_sliced or self.distinct_fields or self.select_for_update
         ):
             return
-        self.order_by = ()
+        order_by = []
+        if not force:
+            for item in self.order_by:
+                if not self.ordering_needs_grouping(item):
+                    continue
+                order_by.append(item)
+        self.order_by = tuple(order_by)
         self.extra_order_by = ()
         if clear_default:
             self.default_ordering = False
