2016-11-15 5 views
0

この質問をどのように行うかはわかりませんので、例を使って何をしようとしているかを説明します。私はPythonのSQLAlchemyを使用していますが、単純な古いSQLの答えはうまくいくので、クエリを理解することができます。動的プロパティの結合から行をフィルタリングするためのSQLの取得

私はこのような何かを見て二つのテーブル(これは不自然な例です)、している:「アップデート」の表は、スクリプトを経由して、毎日

Table: Users 
id | username 
1 | john 
2 | bob 
3 | mary 
4 | sally  

Table: Updates 
id | date | message | user_id 
1 | 11-14 | m3  | 1 
2 | 11-13 | m2  | 1 
3 | 11-12 | m1  | 1 
4 | 11-13 | n2  | 2 
5 | 11-12 | n1  | 2 
6 | 11-12 | o1  | 3 

を移入されますが、各ユーザーが更新を持っていないかもしれませんその日のために。私はどのように私は各ユーザーの "最新の"更新プログラムを取得する両方のテーブルを照会できるか把握しようとしています。

username | date | message 
john  | 11-14 | m3 
bob  | 11-13 | n2 
mary  | 11-12 | o1 
sally |  | 

「日付」の値は、ユーザーごとに同じにはなりませんので、私は、アップつまずいますので、私が一致することはできません:たとえば、私は私の出力は次のようなものを見てみたいと思いますその列を静的な値と比較します。

ハイレベルから、私はこのような何かを見SQLAlchemyのを描く:「LATEST_DATE_IN_UPDATES_BY_USER」は、そのユーザのために、更新テーブルに最新の行を表し

Updates.query.join(Users).filter((Users.id == Updates.user_id) & (Updates.date == LATEST_DATE_IN_UPDATES_BY_USER)).all() 

を。しかし、私はどのようにその行動を取得するか分からない。

答えて

1

SQLでクエリは次のようになります(@ラドゥ・ゲオルギューからの回答に似ている)SQLAlchemyの、シンプルなソリューションを使用して

SELECT Us.username, Up.Date, Up.Message 
FROM USERS Us 
    LEFT JOIN UPDATES Up on Us.id = Up.user_id 
     AND Up.date = (SELECT MAX(date) FROM UPDATES u WHERE u.user_id = Up.user_id) 
0

は次のようになります。

sq = (
    session 
    .query(Update.user_id, func.max(Update.date).label("max_date")) 
    .group_by(Update.user_id) 
).subquery("subq") 

q = (
    session 
    .query(User.username, Update.date, Update.message) 
    .outerjoin(sq, User.id == sq.c.user_id) 
    .outerjoin(Update, and_(User.id == Update.user_id, Update.date == sq.c.max_date)) 
) 

とIFあなたのデータベースはRANKの機能をサポートしています。

関連する問題