0

개별 플레이어의 최신 점수를 표시하는 Flask 앱을 ​​만들려고합니다. 따라서 플레이어는 여러 개의 점수를 가질 수 있지만 리더 보드에서 가장 최근의 점수 만 표시하려고합니다.SQLAlchemy : 조인이 여러 결과를 반환하는 경우 최신 결과 만 표시

내 models.py : 내 app.py에서

class Player(db.Model): 
    __tablename__ = 'player' 
    id = db.Column(db.Integer, primary_key=True) 
    firstname = db.Column(db.String, nullable=False) 
    score = db.relationship('Score', backref='player', lazy='dynamic') 

    def __init__(self, firstname): 
     self.firstname = firstname 

    def __repr__(self): 
     return '<id {}>'.format(self.id) 


class Score(db.Model): 
    __tablename__ = 'score' 
    id = db.Column(db.Integer, primary_key=True) 
    timestamp = db.Column(db.DateTime, nullable=False) 
    score = db.Column(db.String, nullable=True) 
    player_id = db.Column(db.Integer, db.ForeignKey('player.id')) 

    def __init__(self, score, player_id): 
     self.timestamp = datetime.now() 
     self.score = score 
     self.player_id = player_id 

    def __repr__(self): 
     return '<id {}>'.format(self.id) 

나는 다음과 같은 한 :

<tbody> 
    {% for players_with_score in players_with_score %} 
    <tr> 
    <td>{{ players_with_score.Player.firstname }}</td> 
    <td>{{ players_with_score.Score.score }}</td> 
    <td>{{ players_with_score.Score.timestamp }}</td> 
    </tr> 
    {% endfor %} 
</tbody> 
:
@app.route('/', methods=['GET', 'POST']) 
@login_required 
def home(): 
    """Render homepage""" 

    players_with_score = db.session.query(
     Player, Score).join(Score) 

    return render_template('home.html', players_with_score=players_with_score) 

그리고 내 (간체) 템플릿 home.html을에서

이 결과는 모든 점수를 가진 적절한 표를 얻습니다. 그러나 이제 플레이어의 점수가 여러 개인 경우 여러 번 표시됩니다.

플레이어 당 최신 점수 만 표시되도록하려면 쿼리에서 무엇을해야합니까? 나는 .(Score.timestamp == db.session.query(func.max(Score.timestamp)))을 추가하려고 시도했지만 그 결과는 최신 점수가 아니라 플레이어 당 최신 점수라는 결과가 나왔습니다. 테이블이 아니라고

+0

[태그 : 그룹당 최대 n 개]를 원하면 사용중인 DB에 따라 대답이 크게 달라집니다. 예를 들어 외부 조인이나 스칼라 서브 쿼리를 사용하는 "일반적인"솔루션이 있지만 DB 관련 단축키 등이 있습니다. –

+0

이 데이터베이스는 Heroku에서 실행되는 Postgres입니다. –

답변

1

당신은 주어진 n이 1과 동일 , 얻을 PostgreSQL을에 DISTINCT ON ... ORDER BY "관용구"를 사용할 수 있습니다 :

players_with_score = db.session.query(Player, Score).\ 
    join(Score).\ 
    distinct(Player.id).\ 
    order_by(Player.id, Score.timestamp.desc()) 

Score.timestamp이 널 (NULL)이 아니므로, 당신이 내림차순 및 NULL에 대해 걱정할 필요가 없습니다.