Gunnlaugur Briem wrote: > You can put the func.count() label in a variable and filter on it: > > articlecount = func.count(Article.id).label('count') > for article in session.query(Article, articlecount) \ > .join(Article.keywords).group_by(Article.name) \ > .filter(Keyword.name.in_(['k2', 'k3', 'k6', 'k7'])) \ > .filter(articlecount >= 2) \ > .order_by(articlecount.desc()): > > (Untested, but I believe that's about right)
you need to use having() and not filter() to filter aggregates. > > - G. > > > > On Dec 23, 7:03 am, Olli Wang <olliw...@ollix.com> wrote: >> Thanks for reply. I finally got the right result as following: >> >> for article in session.query(Article, func.count(Article.id).label >> ('count')) \ >> .join(Article.keywords).group_by(Article.name) \ >> .filter(Keyword.name.in_(['k2', 'k3', 'k6', >> 'k7'])).order_by('count DESC'): >> print article >> >> And the result looks like this: >> (<article_2>, 3) >> (<article_1>, 2) >> (<article_3>, 2) >> (<article_4>, 1) >> >> However, is it possible to further filter the labeled `count` to be>=2? >> So the result would become: >> >> (<article_2>, 3) >> (<article_1>, 2) >> (<article_3>, 2) >> >> Thanks. >> >> On Dec 23, 6:09 am, Michael Bayer <mike...@zzzcomputing.com> wrote: >> >> >> >> > On Dec 22, 2009, at 1:39 AM, Olli Wang wrote: >> > > Hi, is it possible to query data from a relational table according >> to >> > > a list of matched conditions? For example, assume I have two tables, >> > > Article and Keywords, in a Many-to-Many relationship, and have data >> > > like this: >> >> > > Article 1 has keywords (k1, k2, k3, k4) >> > > Article 2 has keywords (k2, k3, k5, k6) >> > > Article 3 has keywords (k1, k3, k4, k5, k6) >> > > Article 4 has keywords k1, k2, k4, k5) >> >> > > Now I want to find all articles in the order of the number of >> matched >> > > keywords (k2, k3, k6, k7), and the result should like this: >> >> > > 1) Article 2, because it has 3 matched keywords: (k2, k3, k6) >> > > 2) Article 1, because it has 2 matched keywords: (k2, k3) >> > > 3) Article 3, because it has 2 matched keywords: (k3, k6) >> > > 4) Article 4, because it has only 1 matched keyword: (k2) >> >> > > Note that because no article has the keyword "k7", so it just not >> > > count. Please help. Thanks. >> >> > you'd likely want to join from Article to Keywords along the >> many-to-many table, and filter for those Keywords which identify as >> k2, k3, k6, k7, likely using an "in". This join woud look along the >> lines of: >> >> > session.query(Article).join(Article.keywords).filter(Keyword.name.in_('k2', >> 'k3', 'k6', 'k7')) >> >> > > -- >> >> > > You received this message because you are subscribed to the Google >> Groups "sqlalchemy" group. >> > > To post to this group, send email to sqlalch...@googlegroups.com. >> > > To unsubscribe from this group, send email to >> sqlalchemy+unsubscr...@googlegroups.com. >> > > For more options, visit this group >> athttp://groups.google.com/group/sqlalchemy?hl=en. > > -- > > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.