2016-12-28 2 views
0

Ich bin sehr neu auf SQLAlchemy und wie Sie Ich habe 3 Modelle sehen:SQLAlchemy Zählfunktion für verschachtelte Join subquery

categories = db.Table(
    'categories', 
    db.Column('post_id', db.Integer, db.ForeignKey('post.id')), 
    db.Column('category_id', db.Integer, db.ForeignKey('category.id')) 
) 


class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    nickname = db.Column(db.String(64), index=True, unique=True) 
    email = db.Column(db.String(120), index=True, unique=True) 
    posts = db.relationship('Post', backref='author', lazy='dynamic') 
    about_me = db.Column(db.String(140)) 
    last_seen = db.Column(db.DateTime) 


class Post(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    body = db.Column(db.String(140)) 
    timestamp = db.Column(db.DateTime) 
    user_id = db.Column(db.Integer, db.ForeignKey('user.id')) 
    categories = db.relationship("Category", 
          secondary="categories", 
          backref="posts") 



class Category(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(100)) 

kann ich zählen, wie viele Post jeder Benutzer durch eine Unterabfrage wie folgt hat:

stmt = db.session.query(models.Post.user_id, func.count('*').label('post_count')).group_by(models.Post.user_id).subquery() 

db.session.query(models.User, stmt.c.post_count).outerjoin(stmt, models.User.id==stmt.c.user_id).order_by(models.User.id) 

aber ich kann nicht herausfinden, die richtige Abfrage zu berechnen, wie viele Kategorien jeder Benutzer hat.

Antwort

1

Sie könnten beispielsweise hinzufügen, eine zu categories in Ihrer Unterabfrage verbinden und von user_id gruppiert verschiedene Post.id s und category_id s zählen:

stmt = db.session.query(
    models.Post.user_id, 
    func.count(models.Post.id.distinct()). 
     label('post_count'), 
    func.count(models.categories.c.category_id.distinct()). 
     label('category_count') 
).\ 
    join(models.categories).\ 
    group_by(models.Post.user_id).\ 
    subquery() 

db.session.query(models.User, 
       stmt.c.post_count, 
       stmt.c.category_count).\ 
    outerjoin(stmt, models.User.id==stmt.c.user_id).\ 
    order_by(models.User.id) 

Die Post-IDs haben auch verschieden sein, falls ein Beitrag hat mehrere Kategorien, die sich nach dem Join als mehrere Zeilen für den Post manifestieren.

+0

danke für Ihre Antwort, aber das Abfrageergebnis ist falsch, zum Beispiel habe ich einen Benutzer, der an drei Kategorien teilnehmen, aber Ihre Abfrage gibt zwei für diesen Benutzer zurück. – nim4n

+0

Ich habe Ihren Code von "stmt.c.post_count" in "stmt.c.category_count" geändert und es hat funktioniert! Vielen Dank für Ihre Hilfe – nim4n

+1

Sie haben vergessen, das Attribut in der letzten Abfrage hinzuzufügen/zu ändern, froh, dass Sie es selbst aussortiert haben. –