Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:如果联接返回多个结果,则仅显示最新结果_Python_Flask_Sqlalchemy_Flask Sqlalchemy_Greatest N Per Group - Fatal编程技术网

Python SQLAlchemy:如果联接返回多个结果,则仅显示最新结果

Python SQLAlchemy:如果联接返回多个结果,则仅显示最新结果,python,flask,sqlalchemy,flask-sqlalchemy,greatest-n-per-group,Python,Flask,Sqlalchemy,Flask Sqlalchemy,Greatest N Per Group,我正在尝试创建一个Flask应用程序,它显示单个玩家的最新分数。所以一个玩家可以有多个分数,但在排行榜上我只想显示她最近的分数 My models.py: class Player(db.Model): __tablename__ = 'player' id = db.Column(db.Integer, primary_key=True) firstname = db.Column(db.String, nullable=False) score = db.re

我正在尝试创建一个Flask应用程序,它显示单个玩家的最新分数。所以一个玩家可以有多个分数,但在排行榜上我只想显示她最近的分数

My models.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)
在我的(简化)模板home.html中:

<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>

{有分数的玩家的百分比在有分数的玩家中为%}
{{players_with_score.Player.firstname}
{{players_with_score.score.score}
{{players_with_score.score.timestamp}
{%endfor%}
这将生成一个包含所有分数的适当表格,但是现在如果一个玩家有多个分数,它将显示该玩家多次

我需要在查询中做什么来确保只显示每个玩家的最新分数?我尝试添加
(Score.timestamp==db.session.query(func.max(Score.timestamp))
,但这使得唯一的结果是最新的分数,而不是每个玩家的最新分数。

您可以使用Postgresql中的“惯用用法”来获得,其中n等于1,因为您的表并不庞大:

由于
Score.timestamp
不可为空,因此您不必担心降序和空值。

您可以使用Postgresql中的“惯用用法”来获取,其中n等于1,因为您的表并不庞大:


由于
Score.timestamp
不可为空,因此您不必担心降序和空值。

您需要的是,答案在很大程度上取决于您使用的数据库。有使用外部联接或标量子查询的“通用”解决方案,但也有特定于数据库的快捷方式等。这背后的数据库是运行在Heroku上的Postgres。您需要,答案在很大程度上取决于您使用的数据库。有一些“通用”解决方案,例如使用外部联接或标量子查询,但也有特定于数据库的快捷方式等。这背后的数据库是Postgres,运行在Heroku上。
<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>
players_with_score = db.session.query(Player, Score).\
    join(Score).\
    distinct(Player.id).\
    order_by(Player.id, Score.timestamp.desc())