2013-06-21 3 views
3

Я запрашивая две таблицы с SQLAlchemy, я хочу использовать отличную возможность на моем запросе, чтобы получить уникальный набор идентификатор клиентаSQLAlchemy отчетливого, order_by другого столбца

У меня есть следующий запрос:

orders[n] = DBSession.query(Order).\ 
      join(Customer).\ 
      filter(Order.oh_reqdate == date_q).\ 
      filter(Order.vehicle_id == vehicle.id).\ 
      order_by(Customer.id).\ 
      distinct(Customer.id).\ 
      order_by(asc(Order.position)).all() 

Если вы видите, что происходит здесь, я запрашиваю таблицу заказов для всех заказов за определенную дату, для конкретного автомобиля, это работает нормально. Однако некоторые клиенты могут иметь более одного заказа за одну дату. Поэтому я пытаюсь отфильтровать результаты, чтобы только один раз указывать каждого клиента. Эта работа прекрасна, однако для этого я должен сначала заказать результаты по столбцу, на котором есть отдельная() функция. Я могу добавить во второй order_by в столбец, я хочу, чтобы результаты упорядочивались, не вызывая синтаксическую ошибку. Но он игнорируется, и результаты просто упорядочиваются Customer.id.

Мне нужно выполнить мой запрос в таблице заказов и присоединиться к клиенту (а не наоборот) из-за того, как были установлены внешние ключи.

Это то, что я хочу сделать в рамках одного запроса? Или мне нужно будет перерисовать мои результаты, чтобы получить нужные данные в правильном порядке?

ответ

3

Вам не нужно «перецифровывать» - если вы имеете в виду загрузку строк в Python, то есть. Вероятно, вы хотите создать подзапрос и выбрать из него, который вы можете достичь, используя query.from_self().order_by(asc(Order.position)). Более конкретные сценарии вы можете получить, используя subquery().

В этом случае я не могу сказать, для чего вы собираетесь. Если у клиента более одного ордера с запрошенным идентификатором и датой транспортного средства, вы получите две строки: по одному для каждого ордера, а каждая строка заказа будет ссылаться на Клиента. Что именно вы хотите вместо этого? Только строка первого порядка в каждой группе клиентов? Я бы сделал это вот так:

highest_order = s.query(Order.customer_id, func.max(Order.position).label('position')).\ 
        filter(Order.oh_reqdate == date_q).\ 
        filter(Order.vehicle_id == vehicle.id).\ 
        group_by(Order.customer_id).\ 
        subquery() 

s.query(Order).\ 
    join(Customer).\ 
    join(highest_order, highest_order.c.customer_id == Customer.id).\ 
    filter(Order.oh_reqdate == date_q).\ 
    filter(Order.vehicle_id == vehicle.id).\ 
    filter(Order.position == highest_order.c.position) 
+0

Ahh thanks, thats гораздо лучший подход. Я добавил в s.qeury order_by (Order.position) .all() и решил, что гораздо лучше использовать два запроса – crooksey