개별 플레이어의 최신 점수를 표시하는 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)))
을 추가하려고 시도했지만 그 결과는 최신 점수가 아니라 플레이어 당 최신 점수라는 결과가 나왔습니다. 테이블이 큰 아니라고
[태그 : 그룹당 최대 n 개]를 원하면 사용중인 DB에 따라 대답이 크게 달라집니다. 예를 들어 외부 조인이나 스칼라 서브 쿼리를 사용하는 "일반적인"솔루션이 있지만 DB 관련 단축키 등이 있습니다. –
이 데이터베이스는 Heroku에서 실행되는 Postgres입니다. –