SQL炼金术中嵌套关系的联接

2024-10-01 13:39:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我是SQL炼金术新手,在从联接中获得所需结果时遇到一些问题。 我有以下型号

    class QShow(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name =  db.Column(db.String(50))
        starts_on = db.Column(db.Date)
        ends_on = db.Column(db.Date)
        form_id = db.Column(db.String(50))

class Competition(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(60))
        show_id = db.Column(db.Integer,db.ForeignKey('q_show.id'))
        show = db.relationship("QShow", backref=db.backref("showa", uselist=False))

class Start(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    rider_id = db.Column(db.Integer, db.ForeignKey('rider.id'))
    rider = db.relationship("Rider", backref=db.backref("riders", uselist=False))
    competition_id = db.Column(db.Integer, db.ForeignKey('competition.id'))
    competition = db.relationship("Competition", backref=db.backref("competitiona", uselist=False))
    show_id = db.Column(db.Integer, db.ForeignKey('q_show.id'))
    show = db.relationship("QShow",  backref=db.backref("shows",uselist=False))

class Rider(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(30))
    last_name = db.Column(db.String(35))
    starts = db.relationship('Start',backref='riderref',lazy='dynamic')

每一场比赛都有多个比赛,每一个比赛都有多个起跑点,一个骑手需要一个起跑点才能参加一个比赛,而且每个比赛都可以有一个以上的起跑。所有这些都是表演的一部分。在

比赛和开始数据很容易查询,因为他们有一个FK的show_id。但是我希望得到所有的车手在一个特定的显示。在

有了这个问题,我得到了所有的车手,不管车展如何。我知道我错过了什么。在

^{pr2}$

有人能帮我弄明白这种疯狂吗?在

更新1

我试着加入QShow,这是有意义的,但我仍然收到来自所有节目的车手。在

rider = Rider.query \
          .join(Start) \
          .join(Competition) \
          .join(QShow)\
          .filter(QShow.id == show_id)

更新2

在考虑这一点时,我做了一个可行的解决办法,但是我仍然想了解我在《车手秀》一路走来的连接中做错了什么。在

rider = Rider.query \
           .join(Start) \
           .filter(Start.show_id == show_id)

Tags: keyiddbstringmodelshowcolumninteger