سكل - الخيمياء تاريخ الاستعلام - الطريقة الأكثر فعالية للاستعلام

StackOverflow https://stackoverflow.com//questions/25090375

سؤال

أحاول إنشاء استعلام ويواجه صعوبة في العثور على الطريقة الأكثر فعالية للقيام بذلك في سكلالشيمي، (ملاحظة أنا باستخدام قارورة-سكلالشيمي)

الهدف هو العثور على جميع المستخدمين لديهم اجتماع مع مستخدم معين.

لذلك دعونا نقول فرانك لديه 10 اجتماعات القادمة ، أريد أن تولد قائمة من جميع الناس فرانك لديه لقاء مع.

هنا نماذج بلدي:

class UserMeeting(db.Model):
    """ Associative table, links meetings to users in a many to many fashion"""
    __tablename__ = 'userMeeting'
    id = db.Column(db.Integer, primary_key = True)
    meeting_id = db.Column(db.Integer, db.ForeignKey('meeting.id'), primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)

class Meeting(db.Model):
    __tablename__ = "meeting"
    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(128))
    #... other columns
    #associative reference
    attendees = db.relationship('UserMeeting', backref='meeting')

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key = True)
    email = db.Column(db.String(128), index=True, unique=True)
    password = db.Column(db.String(128))
    #associative reference
    attendingMeetings = db.relationship("UserMeeting", backref="user", cascade="all, delete-orphan") 

وهنا ما حاولت:

#Assume frank's a user with id == 1
frank = User.query.get(1)
franks_meetings = Meeting.query.join(Meeting.attendees).filter(UserMeeting.user == frank).all()
#not efficient way of getting users in meetings with frank
users = []
for meeting in franks_meetings:
    for userMeeting in meeting.attendees:
        if userMeeting.user != frank:
            users.append(userMeeting.user)

#is there a way to just generate one query and get this data?

يبدو أنني أفتقد كيف يمكنني فقط استخدام الصلات للحصول على هذه البيانات.أي مساعدة سيكون موضع تقدير!

هل كانت مفيدة؟

المحلول

تحتاج إلى الانضمام إلى جدول اجتماع المستخدم مع نفسه ، باستخدام معرف الاجتماع كمفتاح الانضمام.قد تحتاج إلى الاسم المستعار للجدول من أجل الرجوع إليه مرتين.أنا لا أعرف ما إذا كان يمكنني كتابة بناء الجملة سكلالشيمي لذلك قبالة الجزء العلوي من رأسي ، ولكن يبدو سكل مثل:

select distinct(b.user_id) as other_user_id
from usermeeting a
inner join usermeeting b
on a.meeting_id=b.meeting_id
where a.user_id=1 and b.user_id != 1;

و 1 هو فرانك.

أوه ، والحصول على تفاصيل المستخدم أيضا.ربما يمكن أن ينتهي بك الأمر مع User الكائنات مباشرة من القيام بذلك في سكلالكيمي:

select distinct(u.id), u.email
from usermeeting a
inner join usermeeting b
on a.meeting_id=b.meeting_id
inner join users u
on b.user_id=u.id
where a.user_id=1 and b.user_id != 1;

نصائح أخرى

إليك إصدار SQLAlchemy للاستعلام للرجوع إليه:

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top