2013-11-27 17 views
0

我有2款簡化這個例子(域,訪問)的緣故,我想通過列屬性來選擇給定域的最後訪問時間戳選擇記錄通過column_property

Domain.last_visit = db.column_property(
    db.select(
    [ db.func.ifnull(Visit.timestamp, 0) ], 
    Visit.domain_id == Domain.id 
).order_by(Visit.timestamp.desc()).limit(1).correlate(Visit.__table__).label('domain_last_visit'), 
    deferred = True 
) 

我的問題是該值始終返回NULL而不是0。我非常肯定這是因爲我不知道如何選擇我想要的唱片,並且在那裏放置了這個限制。

任何想法我做錯了什麼?

回答

1

如果您的Visit行有timestamp = NULL,那麼您的IFNULL只會回退到0。但它不包括Domain還沒有相應的Visit記錄的情況。才達到該

的一種方法是對結果使用MAX骨料代替ORDER BY ... DESC和APPY IFNULL

Domain.last_visit = column_property(
    select([ func.ifnull(func.max(Visit.timestamp), 0) ], 
     Visit.domain_id == Domain.id 
    ).correlate_except(Visit).label('domain_last_visit'), 
    #deferred = True 
) 

請注意,correlate_except使用,而不是correlate在你的代碼中發現,不正確地過濾了結果。

您可能還會考慮Hybrid Attributes

+0

@ romeo-mihalcea:謝謝你接受這個解決方案。你會分享什麼/爲什麼確切地在你的情況下工作?謝謝! – van