2013-03-21 166 views
1

所以可以說我有這樣定義SQLAlchemy的查詢和過濾

class Person 
    birthday 

class Address 
    state 

一些簡單的課程,我想從每個州最古老的人,我想我會喜歡的東西

db.session.query(Address).order_by(Person.birthday.desc()).first() 
得到它

,但現在我添加另一個類

class pet 
    species 

,我想找到老EST人在每個國家每種類型的物種 所以從下面的...

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嵌套for循環和缺乏查詢使我認爲這是一個不太理想的解決方案。

+0

這裏開始:http://docs.sqlalchemy.org/en/latest/orm/relationships.html – 2013-03-21 18:12:21

+0

@TomDignan,關心更具體。 – 2013-03-21 18:48:41

回答

0

如果您使用的是PostgreSQL,您可以使用DISTINCT ON(...),它取每組中的第一行。在蟒蛇:

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

這將產生類似的東西:

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