From c1eebf5096c0a9dd1c2d254c0f07083d084c2a57 Mon Sep 17 00:00:00 2001 From: collerek Date: Sun, 7 Mar 2021 16:07:22 +0100 Subject: [PATCH] another try - join with distinct from subquery --- ormar/queryset/query.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/ormar/queryset/query.py b/ormar/queryset/query.py index e655359..80ee4a7 100644 --- a/ormar/queryset/query.py +++ b/ormar/queryset/query.py @@ -171,12 +171,12 @@ class Query: """ pk_alias = self.model_cls.get_column_alias(self.model_cls.Meta.pkname) pk_aliased_name = f"{self.table.name}.{pk_alias}" - qry_text = sqlalchemy.text(pk_aliased_name) + qry_text = sqlalchemy.text(f"{pk_aliased_name} as limit_column") maxes = dict() for order in list(self.sorted_orders.keys()): if order is not None and order.get_field_name_text() != pk_aliased_name: - maxes[order.get_field_name_text()] = sqlalchemy.text( - f"max({order.get_field_name_text()})") + aliased_col = order.get_field_name_text() + maxes[aliased_col] = sqlalchemy.text(aliased_col) limit_qry = sqlalchemy.sql.select([qry_text]+list(maxes.values())) limit_qry = limit_qry.select_from(self.select_from) @@ -186,14 +186,18 @@ class Query: exclude=True).apply( limit_qry ) - limit_qry = limit_qry.group_by(qry_text) + limit_qry = limit_qry.group_by(sqlalchemy.text(f"{pk_aliased_name}")) limit_qry = OrderQuery(sorted_orders=self.sorted_orders).apply(limit_qry) - limit_qry = LimitQuery(limit_count=self.limit_count).apply(limit_qry) - limit_qry = OffsetQuery(query_offset=self.query_offset).apply(limit_qry) - limit_qry = limit_qry.alias("limit_query") + limit_qry = limit_qry.alias("inner_limit_query") + outer_text = sqlalchemy.text(f"distinct limit_column") + outer_qry = sqlalchemy.sql.select([outer_text]) + outer_qry = outer_qry.select_from(limit_qry) + outer_qry = LimitQuery(limit_count=self.limit_count).apply(outer_qry) + outer_qry = OffsetQuery(query_offset=self.query_offset).apply(outer_qry) + outer_qry = outer_qry.alias("limit_query") on_clause = sqlalchemy.text( - f"limit_query.{pk_alias}={self.table.name}.{pk_alias}") - return limit_qry, on_clause + f"limit_query.limit_column={self.table.name}.{pk_alias}") + return outer_qry, on_clause def _apply_expression_modifiers( self, expr: sqlalchemy.sql.select