2013-03-21 5 views
1

그래서, 내가SQLAlchemy의 쿼리 및 필터링

db.session.query(Address).order_by(Person.birthday.desc()).first() 
같은과 그것을 를 얻을 수 있다고 생각 나는 그런

class Person 
    birthday 

class Address 
    state 

로 정의 몇 가지 간단한 클래스를 가지고 있고 각각의 상태에서 가장 오래된 사람을 원하는 말할 수

하지만 지금은 다른 클래스

class pet 
    species 

를 추가하고 난 이전을 찾으려면 그는 가장 오래된 없었기 때문에 다음에서 이렇게 종 의 각 유형에 대한 각 상태에서 추정 사람 ...

john - MI - dog - 50 
alex - MI - dog - 51 
joe - MI - cat - 10 
tina - FL - cat - 20 

난 그냥,

alex, joe, tina 

하지만 존을 원하는 것입니다.

어떻게 그 일을하는 쿼리를 작성할 수 있습니다. 어떤 주제를 배워야합니까? ?

이것은 지금까지 최선의 시도입니다. 이 코드는 내 데이터베이스에만 해당됩니다.

def most_recent_completed_uss(user): 
    lids = [] 
    for o in user.organizations: 
     for sh in o.survey_headers: 
      for ss in sh.survey_sections: 
       l = datetime.datetime(1,1,1) 
       lid = None 
       for uss in ss.user_survey_sections: 
        if o.id == uss.organization.id: 
         if l == datetime.datetime(1,1,1): 
          lid = uss.id 
         if (uss.completed_date and uss.completed_date >= l): 
          l = uss.completed_date 
          lid = uss.id 
       lids.append(lid) 
    return lids 

물론 4 개의 루프에 대해 중첩되어 있으며 쿼리가 부족하여 이것이 덜 이상적인 솔루션이라고 가정합니다.

+0

시작 : 비슷한를 생성합니다

session.query(Person) .join(Address, Pet) .distinct(Address.state, Pet.species) .order_by(Address.state, Pet.species, Person.birthday) 

: 파이썬에서 http://docs.sqlalchemy.org/en/latest/orm/relationships.html –

+0

@TomDignan, 더 구체적으로 다루십시오. –

답변

0

PostgreSQL을 사용하는 경우 각 그룹의 첫 번째 행을 취하는 DISTINCT ON (...)을 사용할 수 있습니다. 여기

SELECT DISTINCT ON(address.state, pet.species) person.* 
FROM person 
JOIN address ON person.address_id = address.id 
JOIN pet ON pet.owner_id = person.id 
ORDER BY address.state, pet.species, person.birthday