在python中交叉引用两个表?

在python中交叉引用两个表?,python,flask,sqlalchemy,Python,Flask,Sqlalchemy,我有一张叫做article的桌子。它有一列article.id和article.snippet 我有另一张桌子,叫做article_vote。它有一列article_id,它是article.id的外键,vote_choice_id是1到6之间的数字 我想插入一个片段,让程序在vote\u choice\u id=1、vote\u choice\u id=2、vote\u choice\u id=3等情况下计算该片段的所有vote\u choice\u id。这意味着交叉引用这两个表,这让我感到

我有一张叫做article的桌子。它有一列article.id和article.snippet

我有另一张桌子,叫做article_vote。它有一列article_id,它是article.id的外键,vote_choice_id是1到6之间的数字

我想插入一个片段,让程序在vote\u choice\u id=1、vote\u choice\u id=2、vote\u choice\u id=3等情况下计算该片段的所有vote\u choice\u id。这意味着交叉引用这两个表,这让我感到困惑

以下是我当前的代码:

##############################################
class Article(db.Model):
    # object mirrors table 'article'
    id = db.Column('id', db.Integer, primary_key=True)
    title = db.Column(db.String(400))
    url = db.Column(db.String(400))
    image_url = db.Column(db.String(400))
    snippet = db.Column(db.String(1000))
    date_upload = db.Column(db.DateTime(), default=datetime.utcnow)

    def __init__(self, title, url, image_url, snippet):
        self.title = title
        self.url = url
        self.image_url = image_url
        self.snippet = snippet


##############################################
class ArticleVote(db.Model):
    # object mirrors table 'article_vote'
    id = db.Column('id', db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.fb_id'))  # Sloppy
    article_id = db.Column(db.Integer, db.ForeignKey('article.id'))
    vote_choice_id = db.Column(db.Integer)
    comment = db.Column(db.String(400))

    def __init__(self, user_id, article_id, vote_choice_id, comment):
        self.user_id = user_id
        self.article_id = article_id
        self.vote_choice_id = vote_choice_id
        self.comment = comment
下面是我在尝试遵循一个我不太理解的示例后写的内容:

##############################################
class PublicationVoteSummary():
# This object keeps the count of votes for a Publication

    def __init__(self, article_id):
        self.snippet = snippet
        self.choice_count = {}  # count by textual choice
        self.choice_id = {}

        pub_choice_list = VoteChoice.getVoteChoiceList()

        for item in pub_choice_list:
            self.choice_id[str(item.id)] = item.choice
        for item in pub_choice_list:
            self.choice_count[item.choice] = 0
        self.total_votes = 0

    def addVote(self, choice):
        self.choice_count[choice] = self.choice_count[choice] + 1
        self.total_votes = self.total_votes + 1

    def getVoteCount(self, choice):
        return self.choice_count[choice]

##############################################
def retrieve_publication_summary(article_id):
    pub_obj = PublicationSummary(article_id)
    publication_list = db.session.query(ArticleVote, Snippet).filter(ArticleVote.article_id == article_id).filter(
        ArticleVote.vote_choice_id == 1).all()
   for item in vote_choice_id:
        # avs_obj.appendComment(item.comment) # 09/27 - added to show comments in results page
        avs_obj.appendDetail((item[1].name, text, item[0].comment))  
    return pub_obj
我也试过:

SELECT 1.(count)
FROM   article_vote
       INNER JOIN vote_choice_id
           ON Article.id = Article_vote.article_id
WHERE  Article_vote.vote_choice_id = 1

只要给定代码段至少有一个投票选择id,此查询将输出该代码段的每个投票选择id的代码段和投票计数

import sqlalchemy as sa

q = (db.session.query(Article.snippet, ArticleVote.vote_choice_id, sa.func.count(ArticleVote.id))
              .join(ArticleVote, Article.id == ArticleVote.article_id)
              .group_by(Article.snippet, ArticleVote.vote_choice_id)
              .order_by(Article.snippet, ArticleVote.vote_choice_id.desc()))

for snippet, vote_choice_id, count in q:
    print(snippet, vote_choice_id, count)
该代码生成以下SQL:

选择article.snippet作为article\u snippet,article\u vote.vote\u choice\u id作为article\u vote\u choice\u id,countarticle\u vote.id作为count\u 1 从文章 加入article\u vote ON article.id=article\u vote.article\u id 按article.snippet分组,article\u vote.vote\u choice\u id 按文章排序。代码段,文章\u投票。投票\u选择\u id描述 并产生类似于

纽约时报638 《纽约时报》5 46 纽约时报436 纽约时报344 纽约时报234 ... 要获取给定代码段的计数和投票选择id,可以通过向查询中添加筛选器并从输出中删除投票选择id以及GROUP by和ORDER by子句来获取:

生成此SQL:

选择article.snippet作为article\u snippet,countarticle\u vote.id作为count\u 1 从文章 加入article\u vote ON article.id=article\u vote.article\u id 其中article.snippet=?和article_vote.vote_choice_id=? 这个输出:

《纽约时报》34
你好。事实上,我正试图为所有具有相同代码片段的文章争取选票,代码片段是我的发布词——就像《纽约时报》网站一样,不仅仅是对那篇特定文章的投票。这似乎吸引了所有人对这篇文章的投票,而不是所有发表同一出版物的文章。这就是我试图交叉引用文章表的原因。我已更改了查询-它是否符合您的要求?是的!非常感谢,这已经困扰了我好几天了。如果你有机会的话:你知道我会如何将不同投票选择的计数存储为不同的变量吗?就像一个用于所有2的计数的变量,一个用于所有3的计数的不同变量,等等?我认为您不可能在一行中轻松获得它们-我建议修改第一个查询,例如在.join和.group\u by之间添加.filterArticleVote.vote\u choice\u id==2,这将为每个代码段/选项组合提供一行。
q = (db.session.query(Article.snippet, sa.func.count(ArticleVote.id))
               .join(ArticleVote, Article.id == ArticleVote.article_id)
               .filter(Article.snippet == 'New York Times')
               .filter(ArticleVote.vote_choice_id == 2)
               .group_by(Article.snippet))
for snippet, count in q:
    print(snippet, count)